0

我有一个列表视图,单击时我尝试更改列表视图适配器行内的箭头图像。这工作正常,但我有一个问题,不仅单个图像发生变化。箭头图像上方和下方的几行也发生了变化。

它每 6 行更改一次图像。

我的 onClick 事件的代码是这样的:

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


    if (row != null) 
    {
         ImageView PfeilImage = (ImageView) row.findViewById(R.id.imageView1);
         PfeilImage.setImageResource(R.drawable.pfeil);
    }
     ImageView PfeilImage2 = (ImageView) view.findViewById(R.id.imageView1);
     PfeilImage2.setImageResource(R.drawable.pfeil_aktiv);

     row = view;
     getInfoById(position);
     }
  });

如果有人可以帮助我解决这个问题,那就太好了。

提前感谢弗兰克

4

2 回答 2

0

对于 ListView 的设置方式来说,这实际上是正常的,因为它的设计目的不是重新膨胀视图,而是重新使用它们;这就是为什么你不能只改变图像,你需要改变它指向的数据。

在适配器的 getView() 方法中,对此的解决方案是检查数据并根据该数据设置背景图像。

您可能希望创建一个新类来保存当前数据和要使用的新图像。IE。

Class ListViewItem
  -int imageToUse
  -Object whateverDataYouWereOriginallyUsing

然后根据 ListViewItem.get(position).imageToUse 设置该视图的图像

现在,当您实际根据用户点击更改数据时,您需要在适配器上调用 notifyDataSetChanged() 以便它根据新的 DataSet 和您的 getView() 方法重新评估 UI

于 2013-06-04T21:40:04.150 回答
0

明白了,非常感谢。

在我的适配器类中,我创建了一个新的 int 变量“myClickedPosition”。

在我的点击事件中,我设置了这个变量,然后我设置了 notifyDataSetInvalid 来重绘列表视图:

 list.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> theAdapter,View view, int position, long id) {
  LazyAdapter mAdapter = (LazyAdapter) theAdapter.getAdapter();
  mAdapter.myClickedPosition=position;
  mAdapter.notifyDataSetInvalidated();
  getInfoById(position);

  }
 });

在我的 getView 函数中,我检查点击的位置:

 if(myClickedPosition == position)
 {
   PfeilIcon.setImageResource(R.drawable.pfeil_aktiv);
 } else {
   PfeilIcon.setImageResource(R.drawable.pfeil);
 }

现在一切正常。

于 2013-06-06T13:37:42.837 回答