自定义列表视图索引自动更改

时间:2012-08-05 13:15:33

标签: android

我列出了当用户点击某个项目时我查看用户点击了此项目的图片的列表视图。列表视图会从通知中填充。

假设一个项目被添加到listview中。现在我点击该项目,图像显示在它前面。现在当我在列表视图中输入新项目时,什么都不会发生(现在列表视图中有2个项目)。当我在列表视图中添加第三个项目时,位置0处的项目中的图像会隐藏并显示在位置1.为什么会发生这种情况?

现在在listview项目中添加图像。我必须首先对下一个开放活动执行一些检查,如果这些检查成功,那么我会在活动中点击该项目前面放置一个图像。

所以要做到这一点我所做的是我在下一个活动中发送被点击的项目位置并执行那些检查,如果这些检查成功我通过使用我在上一个活动的onActivityResult函数上放置和图像我发送到此活动的那个位置。意思是我将该位置值发送回我放置图像的onActivityResult函数中的上一个活动。

图像的放置工作正常。但是当我收到通知时,我在列表视图中添加了项目,这导致再次为列表视图中的每个项目调用getView函数以填充列表视图。问题发生了即列表中位置0项的图像转到位置1项。

请询问是否需要更多解释或不清楚。

这是listview项目的代码点击:

                   TextView tv=(TextView)view.findViewById(R.id.clientip);

                    Intent i=new Intent(getApplicationContext(),ChatPageActivity.class);
                    i.putExtra("AdminEmail",ClientListActivity.AdminEmail);
                    i.putExtra("ClientIp",tv.getText().toString());
                    i.putExtra("ChildAt", position);

                    startActivityForResult(i, 200);

ChildAt是我发送的职位。 在下一个活动中执行检查后。

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
    try {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode!= 23)
    {   
        Integer integer=data.getExtras().getInt("ChildAt");
        ImageView imageView=(ImageView)lv.getChildAt(integer).findViewById(R.id.onlineImg);
        imageView.setImageResource(R.drawable.online);
    }

}catch(Exception e)
{
    Log.e("ClientList_onActivityResult",e.getMessage());
}

}

这是onActivityResult如果代码不等于23,则意味着下一个活动中的所有检查都是正确的,您可以将图像放置在下一个活动的位置,该位置将再次发送回此活动活性。

以下是我的BaseAdapter类的getView代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view=convertView;

    if(convertView==null)
        view=inflater.inflate(R.layout.activeclientlist,null);

    TextView ip=(TextView)view.findViewById(R.id.clientip);

    String clientip=this.iplist.get(position);

    ip.setText(clientip);


    return view;
}

baseADapter我使用这段代码在现有列表视图中插入项目..

    this.iplist.add(ip);
    this.notifyDataSetChanged();

重要:
另外我想提一下,这种行为发生在一个模式中,即当我插入第三个项目时,我已经告诉上面的图像位置发生了变化。之后,当我添加第五个项目时,它会再次改变,等等。

1 个答案:

答案 0 :(得分:0)

您应该放置代码以更新适配器本身内的图像视图。

适配器还应该知道绘制数据所需的所有信息。因此,不存储字符串列表,而是存储一个对象列表,如:

class Client {
  String ipAddress;
  boolean isConnected;
}

然后您必须更改适配器:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view=convertView;

    if (convertView==null) {
        view=inflater.inflate(R.layout.activeclientlist,null);
    }

    TextView ip=(TextView)view.findViewById(R.id.clientip);
    ImageView status = (ImageView )view.findViewById(R.id.status);

    Client c = getItem(position);


    ip.setText(c.getIpAddress());
    status.setImageDrawable(c.isConnected() ? R.drawable.ic_status_connected : 0);

    return view;
}

然后只需更改代码即可在连接状态更改时更新图像:

  if (resultCode!= 23) {   
     Integer i = data.getExtras().getInt("ChildAt");
     ((Client)adapter.getItem(i)).isConnected = true;
     adapter.notifyDataSetChanged();
  }

这样,您可以保留与在适配器中表示数据相关的所有代码。副作用,应该是纠正你的代码。

还可以查看ViewHolder模式,以避免在有convertView可用时在每一行上执行findViewById。