0

ユーザーがアイテムをクリックすると、ユーザーがこのアイテムをクリックしたという画像を表示するリストビューがあります。リストビューは通知から取り込まれます。

リストビューにアイテムが追加されたとします。そのアイテムをクリックすると、その前に画像が表示されます。リストビューに新しいアイテムを入力しても、何も起こりません(リストビューには2つのアイテムがあります)。リストビューに 3 番目のアイテムを追加すると、位置 0 のアイテムの画像が非表示になり、位置 1 に表示されます。これはなぜですか?

リストビュー項目に画像を追加します。最初に、次の開始アクティビティでいくつかのチェックを実行する必要があります。これらのチェックが成功した場合は、アクティビティでクリックされたアイテムの前に画像を配置します。

これを行うために、次のアクティビティでクリックされたアイテムの位置を送信し、それらのチェックを実行します。これらのチェックが成功した場合、onActivityResultこのアクティビティに送信した位置を使用して、前のアクティビティの機能に配置してイメージします.その位置の値をonActivityResult、画像を配置する関数の前のアクティビティに送り返すことを意味します。

画像の配置は正常に機能しますが、通知を受け取っている間にリストビューにアイテムを追加すると、リストビューgetViewの各アイテムに対して関数が再度呼び出されてリストビューにデータが入力されます.ここで問題が発生します。位置0のアイテムからの画像リストの 1 番目の項目に移動します。

さらに説明が必要な場合や不明な点がある場合は、質問してください。

リストビューアイテムクリックのコードは次のとおりです。

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

重要:
また、この動作はパターンで発生することに言及したいと思います。つまり、3 番目のアイテムを挿入すると画像の位置が変化します。その後、5 番目のアイテムを追加すると再び変化します。

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

このようにして、アダプター内のデータの表現に関連するすべてのコードを保持します。副作用、コードを修正する必要があります。

また、convertView を使用できる場合に、各行で findViewById を実行しないように、ViewHolder パターンを確認してください。

于 2012-08-05T13:38:02.167 に答える