【问题标题】:ListView item's OnClickListener behaviour replicating on more itemsListView 项目的 OnClickListener 行为复制到更多项目
【发布时间】:2018-06-11 05:14:28
【问题描述】:

当我有一个简单的 ListView 并且我想通过单击它来更改显示项目字符串的 TextBox 的颜色时,我使用以下代码:

public class ListViewActivity extends Activity {

ListView listView;

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

    ArrayList<String> list=new ArrayList<String>();
    for (int i = 0; i < 100; i++) {
        list.add(String.valueOf(i));
    }

    listView=(ListView) findViewById(R.id.listView1);
    CustomArrayAdapter adapter=new CustomArrayAdapter(this,R.layout.listview_row,R.id.listviewRow,list);
    listView.setAdapter(adapter);

}

class CustomArrayAdapter extends ArrayAdapter<String>{


    public CustomArrayAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List<String> objects) {
        super(context, resource, textViewResourceId, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view=super.getView(position,convertView,parent);

        ViewGroup vg=(ViewGroup) view;
        TextView txtView=(TextView) vg.getChildAt(0);

        if (!txtView.hasOnClickListeners()){
            txtView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    TextView t=(TextView) v;
                    t.setTextColor(0xffbababa);
                    t.invalidate();
                }
            });
        }

        return view;
    }
}

}

和布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="gr.spunitrade.development.spda.ListViewActivity">

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/listView1">

</ListView>

<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/listviewRow"
        />

</LinearLayout>

当单击项目时,可以通过向下滚动 ListView 看到更多未单击的项目已灰显。即使在 listView.setOnItemClickListener 替代实现上执行灰显也会发生相同的行为。

我不明白为什么会这样。 OnClick 事件上的断点只被命中一次。

【问题讨论】:

  • 这是因为视图正在被回收。从技术上讲,灰色的视图都是相同的视图。刚刚被回收。请参阅我的想法的答案。

标签: android listview


【解决方案1】:

我会这样接近。

假设您想根据点击切换颜色。

根据数据源的大小保留一个布尔数组。

初始化为假。

单击时设置为 true 并设置颜色。然后在创建视图中根据布尔值设置颜色。

【讨论】:

  • 是的,如果是这样,那么这似乎是一个不错的解决方法。
  • 是的,不认为这是正确的。如果您得到更好的答案,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多