ListView文本更改但不适配数据

时间:2015-02-23 04:56:26

标签: android listview adapter android-arrayadapter

我在ListView添加了3个项目。每个项目都说“测试”。当我点击某个项目时,我会清除该项目的文本。但是,当我在“监视”日志中检查变量时,即使我删除了文本,该项仍然被命名为“测试”。

观看日志:

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

    }
}

2 个答案:

答案 0 :(得分:2)

尝试直接更新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();
    }
}

希望它对你有用。

答案 1 :(得分:0)

在项目单击列表器上,您必须获取行的视图,使用该行对象并查找该行中的视图,即您的案例中的textview。将该视图的文本设置为空白,并更改该位置上的数据集项,以便视图和数据同步。这样就无需更新整个列表并节省时间。

如果上述任何一点不明确,请提及。