【问题标题】:How Do I Remove Selected Item From ArrayList and ArrayAdapter On Button Click?如何在单击按钮时从 ArrayList 和 ArrayAdapter 中删除所选项目?
【发布时间】:2019-06-22 01:17:51
【问题描述】:

我有一个带有自定义列表布局的 ListView。我为此使用了 ArrayList 和 ArrayAdapter。我很难从数组列表中删除选定的项目。我不确定我是否做错了。这是我拥有的数组列表的示例:

项目 A

项目 B

项目 C

项目 D

假设我在单击标记为“删除”的按钮上选择了下一个项目 C,我希望将项目 C 从列表中删除。我该如何做到这一点?目前我的代码只删除索引 0 上的项目。我希望删除选定的项目索引。

这是我的代码...

Java 类:

public class MainActivity extends AppCompatActivity {

ListView lstVw;
Button addBtn, removeBtn, clearListBtn;

ArrayList<String> arrayList;
ArrayAdapter<String> adapter;
int getPosition = 0;

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

    lstVw = findViewById(R.id.lstView);
    addBtn = findViewById(R.id.add_item_btn);
    removeBtn = findViewById(R.id.remove_item_btn);
    clearListBtn = findViewById(R.id.clear_list_btn);

    arrayList = new ArrayList<>();
    adapter = new ArrayAdapter<>(getApplicationContext(), R.layout.item_list, R.id.item_tv, arrayList);
    lstVw.setAdapter(adapter);



    lstVw.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String getItem = adapter.getItem(position);
            getPosition = Integer.parseInt(getItem);
        }
    });

    addBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
            adb.setTitle("Enter Item Name");
            final EditText itemTxt = new EditText(MainActivity.this);
            itemTxt.setText(getString(R.string.default_item_name_value));
            itemTxt.setInputType(InputType.TYPE_CLASS_TEXT);
            adb.setView(itemTxt);

            adb.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String getItem = itemTxt.getText().toString();

                    Set<String> s = new LinkedHashSet<>(arrayList);
                    if (s.contains(getItem)) {
                        arrayList.clear();
                        arrayList.addAll(s);
                        Toast.makeText(getApplicationContext(), getItem + " already exists in the list!", Toast.LENGTH_LONG).show();
                    } else {
                        arrayList.add(getItem);
                        adapter.notifyDataSetChanged();
                    }
                }
            });

            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });

            adb.create();
            adb.show();
        }
    });

    clearListBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!arrayList.isEmpty()) {
                arrayList.clear();
                adapter.notifyDataSetChanged();
            }
        }
    });


    removeBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String getItem = arrayList.get(getPosition);
            arrayList.remove(getItem);
            adapter.notifyDataSetChanged();
            Toast.makeText(getApplicationContext(), getItem + " is removed!", Toast.LENGTH_LONG).show();
        }
    });

}

}

主要 XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="650dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="650dp">

        <ListView
            android:id="@+id/lstView"
            android:layout_width="match_parent"
            android:layout_height="650dp"
            tools:ignore="NestedScrolling" />

    </RelativeLayout>
</ScrollView>

<include layout="@layout/action_buttons"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"/>

操作按钮 XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="center|top">

<Button
    android:id="@+id/add_item_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:textAllCaps="false"
    android:text="@string/add_item_text"
    android:textSize="14sp"
    android:textStyle="bold"
    android:textColor="@android:color/black"/>

<Button
    android:id="@+id/remove_item_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_toEndOf="@id/add_item_btn"
    android:textAllCaps="false"
    android:text="Remove Item"
    android:textColor="@android:color/black"
    android:textSize="14sp"
    android:textStyle="bold"/>

<Button
    android:id="@+id/clear_list_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_toEndOf="@id/remove_item_btn"
    android:textAllCaps="false"
    android:text="@string/clear_list_text"
    android:textSize="14sp"
    android:textStyle="bold"
    android:textColor="@android:color/black"/>

我的自定义列表布局 XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


<TextView
    android:id="@+id/item_tv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:textSize="20sp"
    android:textColor="@android:color/black"/>

</ScrollView>

感谢您的帮助!谢谢!

【问题讨论】:

  • 尝试从您的自定义列表布局中删除 ScrollView。希望有帮助!

标签: java android android-listview android-listadapter


【解决方案1】:
removeBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String getItem = arrayList.get(getPosition);
        arrayList.remove(getItem);
        adapter.notifyDataSetChanged();
        Toast.makeText(getApplicationContext(), getItem + " is removed!", Toast.LENGTH_LONG).show();
    }
});

你从哪里得到这个 getPosition?

【讨论】:

  • 公共类 MainActivity 扩展 AppCompatActivity { ListView lstVw;按钮 addBtn、removeBtn、clearListBtn;数组列表 数组列表; ArrayAdapter 适配器; int getPosition = 0; lstVw.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { String getItem = adapter.getItem(position); getPosition = Integer .parseInt(getItem); } });
  • 那你想做什么?第一个用户应该选择列表中的项目,然后按删除按钮将其删除。
  • 没错。当用户在选择列表中要删除的项目后单击删除按钮时,用户选择的项目应该被删除。
  • 在点击监听器的项目中使用它:getPosition = position
  • 我试过了,但没有用。我的应用似乎忽略了那个 onitemclicklistener。我放在那里的任何内容都没有显示任何活动。我不知道为什么。
【解决方案2】:

在我看来,您的 int getPosition = 0; 变量没有随着您的新职位而更新。在您的点击侦听器上,您试图将所选项目的值解析为整数,也许您可​​以尝试简单地使用当前位置进行更新?

lstVw.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        getPosition = position;
    }
});

编辑:

你可以这样做:

创建一个您的 Activity 将实现的接口,并由您的适配器用来通知位置更改:

public interface PositionChangeListener {
    void onPositionChanged(int newPosition);
}

创建自定义适配器:

public class CustomAdapterView extends BaseAdapter {

private Context context;
private PositionChangeListener listener;
private ArrayList<String> items;

public CustomAdapterView(Context context, ArrayList<String> items, PositionChangeListener listener) {
    this.context = context;
    this.items = items;
    this.listener = listener;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;

    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate( R.layout.item_list, null);
        viewHolder = new ViewHolder();
        viewHolder.txt = convertView.findViewById(R.id.item_tv);
        viewHolder.txt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onPositionChanged(position);
            }
        });
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.txt.setText(items.get(position));
    return convertView;
}

private class ViewHolder {
    TextView txt;
}

}

现在在你的活动中:

public class MainActivity extends AppCompatActivity implements PositionChangeListener{

ListView lstVw;
Button addBtn, removeBtn, clearListBtn;

ArrayList<String> arrayList;
BaseAdapter adapter;
int getPosition = 0;

@Override
public void onPositionChanged(int newPosition) {
    getPosition = newPosition;
}

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

    lstVw = findViewById(R.id.lstView);
    addBtn = findViewById(R.id.add_item_btn);
    removeBtn = findViewById(R.id.remove_item_btn);
    clearListBtn = findViewById(R.id.clear_list_btn);

    arrayList = new ArrayList<>();
    adapter = new CustomAdapterView(this, arrayList, this);
    lstVw.setAdapter(adapter);

    addBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
            adb.setTitle("Enter Item Name");
            final EditText itemTxt = new EditText(MainActivity.this);
            itemTxt.setText("default item name");
            itemTxt.setInputType(InputType.TYPE_CLASS_TEXT);
            adb.setView(itemTxt);

            adb.setPositiveButton("Add", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String getItem = itemTxt.getText().toString();

                    Set<String> s = new LinkedHashSet<>(arrayList);
                    if (s.contains(getItem)) {
                        arrayList.clear();
                        arrayList.addAll(s);
                        Toast.makeText(getApplicationContext(), getItem + " already exists in the list!", Toast.LENGTH_LONG).show();
                    } else {
                        arrayList.add(getItem);
                        adapter.notifyDataSetChanged();
                    }
                }
            });

            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });

            adb.create();
            adb.show();
        }
    });

    clearListBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!arrayList.isEmpty()) {
                arrayList.clear();
                adapter.notifyDataSetChanged();
            }
        }
    });


    removeBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String getItem = arrayList.get(getPosition);
            arrayList.remove(getItem);
            adapter.notifyDataSetChanged();
            Toast.makeText(getApplicationContext(), getItem + " is removed!", Toast.LENGTH_LONG).show();
        }
    });

}

}

【讨论】:

  • 感谢您的回复。不幸的是 int getPosition = 0;变量没有随您的答案更新。我不知道为什么,但我的应用似乎忽略了 lstView.setOnItemClickListener。我在里面放了一个祝酒词,看看它是否有任何活动,我在列表中点击什么都没关系。
  • 您能否尝试将每个项目的自定义列表布局中的项目设置为 android:focusable="false" android:focusableInTouchMode="false"
  • 我能想到 atm 的唯一解决方案是创建一个自定义适配器,扩展 BaseAdapter,将您的数组列表传递给构造函数,并在覆盖 getView(int position, View view, ViewGroup viewGroup) 时,设置一个视图上的 onClickListener 通知您的活动位置更改。
  • 好吧,你的意思是这样的? stackoverflow.com/questions/28406084/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多