【问题标题】:How to wire up a delete button to delete one item on a listview?如何连接删除按钮以删除列表视图上的一项?
【发布时间】:2016-12-14 21:45:42
【问题描述】:

我知道有很多主题或多或少相同的主题,但没有一个涵盖我的情况:

我试图让我的删除按钮删除列表视图上的一行,并且删除按钮出现在每一行中我让这部分工作但我无法让它在我的主要活动中工作。每次我把这部分放在我的代码中时,代码都会中断:

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();
}

我的MainActivity 没有这段代码就可以正常工作。我不知道这是代码还是我将其放在我的MainActivity 中的位置,如果有人能告诉我,将不胜感激。

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

【问题讨论】:

  • 如果您希望列表视图的每一行都有一个删除按钮来删除该项目,您需要在适配器中添加 clickListener。您能与我们分享您的ToDoItemAdapter 代码吗?
  • 它在代码顶部的 MainActivity.java 中。
  • 正如 Nitpick 博士所说,您需要在适配器的 getView() 方法中设置每个按钮的 OnClickListener。他还要求提供ToDoItemAdapter 类的代码,而不是引用变量的声明。
  • 我刚刚将所有代码添加到线程中,请帮助。

标签: android android-layout listview arraylist


【解决方案1】:

1.) 首先在 to_do_item_layout 中添加一个按钮

2.) 现在添加此代码为每个项目添加一个按钮

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

3.) 添加一个监听器

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

【讨论】:

  • 谢谢我在返回convertView后把它放在我主要活动的末尾; ?
  • 在 getView 方法中的 TodoItemAdapter 类中
  • 好的,我照你说的做了,毁了它后,当你按下按钮时它崩溃了,不知道为什么。
  • 非常感谢它有效我只有一个问题要问你我有一个小垃圾桶用于删除按钮但如果文本行太长并且如果它的文本行太长它总是会从屏幕上消失太短了,它连接到线知道我的意思,我只是想在应用程序的右侧我会看看我是否可以添加一张图片来向你展示我的意思,如果我不清楚你是否可以为我解决最后一个问题你是救星再次感谢删除代码
  • 确保文本对齐到删除按钮的左侧。它占据了整个空间,这就是垃圾桶消失的原因。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 2023-01-20
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多