2016-08-09 46 views
1

Ich weiß, es gibt viele Threads mit mehr oder weniger gleichen Thema, aber keiner von ihnen deckt meine Situation:Wie verbinde ich eine Schaltfläche zum Löschen, um ein Element in einer Listenansicht zu löschen?

Ich versuche, meine löschen-Taste, um eine Zeile in der Listenansicht zu löschen und die Schaltfläche zum Löschen erscheinen in jedem Ich habe diesen Teil zur Arbeit gebracht, aber ich kann ihn in meiner Hauptaktivität nicht zum Laufen bringen. Der Code hält jedes Mal, wenn ich diesen Teil in meinem Code setzen brechen:

ImageButton removeButton = (ImageButton) findViewById(R.id.btnDel); 
removeButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     onRemoveButtonClick(); 
    } 
    private void onRemoveButtonClick() { 
     ToDoItem item = (ToDoItem) v.getTag(); 
     notifyDataSetChanged(); 
} 

meine MainActivity funktioniert gut ohne dieses Stück Code. Ich weiß nicht, ob es der Code ist oder ob ich es in meinem MainActivity platziere, wenn jemand das bitte gerne wissen würde.

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    private static final String LOG_TAG = "ToDoApp"; 
    private ToDoListManager listManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ListView todoList = (ListView) findViewById(R.id.todo_list); 
     listManager = new ToDoListManager(getApplicationContext()); 
     ToDoItemAdapter adapter = new ToDoItemAdapter(this, listManager.getList()); 


     todoList.setAdapter(adapter); 
     ImageButton addButton = (ImageButton) findViewById(R.id.add_item); 
     addButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onAddButtonClick(); 
      } 
     }); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     listManager.saveList(); 
    } 

    private void onAddButtonClick() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle(R.string.add_item); 

     final EditText input = new EditText(this); 
     input.setInputType(InputType.TYPE_CLASS_TEXT); 
     builder.setView(input); 

     builder.setPositiveButton(
      R.string.ok, 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 
        //Add item to list 
        ToDoItem item = new ToDoItem(
          input.getText().toString(), 
          false 
        ); 
        listManager.addItem(item); 
        Log.i(LOG_TAG, input.getText().toString()); 
       } 
      }); 
     builder.setNegativeButton(
      R.string.cancel, 
      new DialogInterface.OnClickListener(){ 
       @Override 
       public void onClick(DialogInterface dialog, int Which) { 
        dialog.cancel(); 
       } 
      }); 

     builder.show(); 
    } 

    private class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { 

     private Context context; 
     private List<ToDoItem> items; 
     public ToDoItemAdapter(Context context, List<ToDoItem> items){ 
      super(context,-1, items); 

      this.context = context; 
      this.items = items; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(convertView == null) { 
       LayoutInflater inflater = (LayoutInflater) context. 
        getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.to_do_item_layout, parent, false); 
      } 

      TextView textView = (TextView) convertView.findViewById(R.id.item); 
      CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); 

      textView.setText(items.get(position).getDescription()); 
      checkBox.setChecked(items.get(position).isComplete()); 

      convertView.setTag(items.get(position)); 
      convertView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        ToDoItem item = (ToDoItem) v.getTag(); 
        item.toggleComplete(); 
        notifyDataSetChanged(); 
       } 
      }); 
      return convertView; 
     } 
    } 
} 

ToDoListManager.java

public class ToDoListManager { 


private static final String APP_PREFERENCES = "todoapp"; 
private static final String TODO_ITEMS = "itemslist"; 

private List<ToDoItem> items; 
private SharedPreferences savedData; 

public ToDoListManager(Context context) { 

    savedData = context.getSharedPreferences (
     APP_PREFERENCES, 
     Context.MODE_PRIVATE 
    ); 

    String json = savedData.getString(TODO_ITEMS, null); 
    if (json == null) { 
    items = new ArrayList<>(); 
    } else { 

Type type = new TypeToken<List<ToDoItem>>() {}.getType(); 
items = new Gson().fromJson(json, type); 
} 


} 
public List<ToDoItem> getList() { 
return items; 
} 
public void addItem(ToDoItem item) { 
    items.add(item); 
    saveList(); 

} 
public void saveList() { 
    SharedPreferences.Editor edit =savedData.edit(); 
    edit.clear(); 
    String json = new Gson().toJson(items); 

    edit.putString(TODO_ITEMS, json); 
    edit.apply(); 
} 

} 

ToDoItem.java

public class ToDoItem { 
private String description; 
private boolean isComplete; 

public ToDoItem (String description,boolean isComplete) { 
    this.description = description; 
    this.isComplete = isComplete; 
} 

public String getDescription() { 
    return description; 
} 
public boolean isComplete() { 
    return isComplete; 
} 
public void toggleComplete() { 
    isComplete = !isComplete; 
} 
@Override 
public String toString() { 
    return description; 
} 
} 

enter image description here

+0

Wenn Sie möchten, dass jede Zeile der Listenansicht über eine Schaltfläche zum Löschen verfügt, die dieses Element entfernt, müssen Sie den clickListener in Ihrem Adapter hinzufügen. Können Sie Ihren 'ToDoItemAdapter'-Code mit uns teilen? –

+0

es in meiner MainActivity.java an der Spitze im Code. –

+0

Wie Dr. Nitpick sagt, müssen Sie den 'OnClickListener 'jedes Knopfes in der' getView() 'Methode des Adapters setzen. Er fragt auch nach dem Code für die Klasse "ToDoItemAdapter", nicht nach der Deklaration für die Referenzvariable. –

Antwort

1

1.) Fügen Sie eine Schaltfläche, um Ihre to_do_item_layout ersten

2.) Nun diesen Code fügen Sie eine Schaltfläche, um jedes Element hinzuzufügen

Button btn = (Button) convertView.findViewById(R.id.my_btn); 

3.), um es einem Zuhörer hinzufügen

btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     items.remove(items.get(position));   
     } 
}); 
+0

danke ich lege es am Ende meiner Haupttätigkeit nach Rückkehr convertView; ? –

+0

in Ihrer TodoItemAdapter-Klasse innerhalb der getView-Methode – cafebabe1991

+0

ok, also habe ich getan, was Sie gesagt haben, und nachdem Sie es ruiniert haben, stürzte es ab, wenn Sie den Knopf drücken, weiß nicht warum. –