在我的CustomAdapter
列表中,当用户按下其中一行时,我想更改列表中一行的背景颜色。
我有一个静态类,它包含列表每行中的对象:
static class ViewHolder {
ImageView image;
TextView text;
}
持有人包含我名单中的元素:
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.imageView1);
holder.text = (TextView) convertView.findViewById(R.id.textView1);
convertView.setTag(holder);
holder.image.setImageResource(items.get(position).getImage());
holder.text.setText(items.get(position).getTextToView());
对于这个convertView,我以这种方式添加了setOnTouchListener
:
convertView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Toast.makeText(c, "DOWN", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
//Toast.makeText(c, "UP", Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});
我试过了:
convertView.setBackgroundColor(Color.RED);
但是我的编辑抱怨说,convertView
应该是final
并且会干扰其他一些代码。
当用户按下列表中的行时,这非常适用于引发Toast
。
但是,如何更改按下的行的背景颜色?提前致谢。
答案 0 :(得分:2)
尝试将“final”修饰符设置为指向convertView的对象。
final View view = convertView;
holder = new ViewHolder();
holder.image = (ImageView) view.findViewById(R.id.imageView1);
holder.text = (TextView) view.findViewById(R.id.textView1);
view.setTag(holder);
holder.image.setImageResource(items.get(position).getImage());
holder.text.setText(items.get(position).getTextToView());
// And the listener
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
view.setBackgroundColor(Color.RED);
//Toast.makeText(c, "DOWN", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
//Toast.makeText(c, "UP", Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});
答案 1 :(得分:1)
解决问题的简单方法 - 使用临时最终变量。
出现问题是因为在某些情况下(可能不在你的上面),convertView的引用可以在监听器范围之外进行更改。
更多类似Android的解决方案 - 尽可能使用状态drawable - http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList
答案 2 :(得分:0)
为什么不使用
yourList.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
....
view.setBackgroundColor(....);
....
}
});