ListView 文本更改但适配器数据不更改

ListView text changing but not adapter data

我在 ListView 中添加了 3 件商品。每一项都说 "Test"。当我点击一个项目时,我清除了该项目的文本。但是,当我检查 "watches" 日志中的变量时,即使我删除了文本,该项目仍被命名为 "Test"。

观看日志:

adapter2.getItem(1) = {java.lang.String@830045070536}"Test"
list.getItemAtPosition(1) = {java.lang.String@830045070536}"Test"

我希望 ListView 得到更新并在点击后将项目设为空白

例如手表日志应该是这样的:

adapter2.getItem(1) = {java.lang.String@830045070536}""
list.getItemAtPosition(1) = {java.lang.String@830045070536}""

有人可以告诉我为什么会发生这种情况并提供解决方案吗?

已编辑代码

public class ListView2 extends Fragment {

    ListView list;
    ArrayAdapter<String> adapter2;
    List<String> array_list;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.listview2, container, false);

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        array_list = new ArrayList<String>();

        array_list.add("Test");
        array_list.add("Test");
        array_list.add("Test");

        //Build Adapter
        adapter2 = new ArrayAdapter<String>(getActivity(), R.layout.items, array_list);

        //Configure the list view
        list = (ListView) getActivity().findViewById(R.id.listview2);
        list.setAdapter(adapter2);

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                TextView txt = (TextView)view.findViewById(R.id.txt);
                if(txt.getText().toString().equals("Test")) {
                    txt.setText("");
                }else{
                    txt.setText("Test");
                }
                adapter2.notifyDataSetChanged();
            }
        });

    }
}

在项目点击监听器上,您必须获取行的视图,使用该行对象并在该行中找到视图,即您的情况下的文本视图。将该视图的文本设置为空白,并更改该位置上的数据集项,以便视图和数据同步。这样就不需要更新整个列表,节省了时间。

如果以上任何一点不明白,请指出。

尝试直接更新 TextView 不是好方法。您可以使用 remove() 和 insert() 方法来更新您的 ArrayAdapter。作为参考,请查看 here ,

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {

            if(adapter2.getItem(position).equals("Test")) {
                adapter2.remove("Test");
                adapter2.insert("", position);
            }else{
                adapter2.remove("");
                adapter2.insert("Test", position);
            }
            adapter2.notifyDataSetChanged();
        }
    });

更新

这是另一种更新 ArrayAdapter 的方法,无需删除和插入条目到您在评论中提到的相同位置。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
        if(arrayList.get(position).equals("Test")) {
            arrayList.set(position, "");
        }else{
            arrayList.set(position, "Test");
        }
        adapter2.notifyDataSetChanged();
    }
}

希望对你有用。