0

我有一个列表视图,当用户单击一个项目时,我会显示用户单击该项目的图像。列表视图从通知中填充。

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

现在在列表视图项中添加图像。我必须首先对下一个打开活动执行一些检查,如果这些检查成功,那么我将在活动中单击的项目前面放置一个图像。

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

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

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

这是listview Item Click的代码:

                   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,则表示下一个活动中的所有检查都是正确的,您可以将图像放置在从下一个活动再次发送回该活动的位置。

getView是我的 BaseAdapter 类的代码:

@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();

重要提示:
我还想提一下,这种行为发生在一种模式中,即正如我在上面所说的那样,当我插入第三个项目时,图像位置会发生变化。之后,当我添加第五个项目时,它会再次发生变化,依此类推。

4

1 回答 1

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。

于 2012-08-05T13:38:02.167 回答