ListView项的OnClickListener行为复制更多项目

时间:2018-06-10 21:08:39

标签: android listview

当我有一个简单的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事件的断点只被命中一次。

1 个答案:

答案 0 :(得分:1)

我会这样做。

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

保留一组包含数据源大小的布尔值。

初始化为false。

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