0

内部MyListViewAdapterでは視覚的に変更を加えていconvertViewますが、リストが再利用されると、これらの変更は他の行項目にも残ります。つまり、4 行ごとに赤になります。それで?これを防ぐにはどうすればよいですか?

 View getView(View convertView, int position etc)
 {
      Button myButton = (Button)convertView.findViewById(R.id.myButton);
      myButton.setTag(convertView);
      myButton.setOnclickListener( new OnClickListener(){

           public void onClick(View v){
             View containingView = myButton.getTag();
             containingView.setBackgroundColor(Color.RED);
           }


      });

 }

問題は、ビューが再利用されるため、意図したビューを表すセルの場所だけでなく、別の場所に赤いリスト項目があることです。これに対する解決策は何ですか?このようにビューが再利用されないようにするにはどうすればよいですか?

4

4 に答える 4

0

一般的な提案として、コーディングする前に、アダプターについてもう少し読む必要があります。

単純:

  1. onClickListenerを1つだけ作成するように前に言いました。あなたはたくさんの記憶を無駄にしている
  2. convertViewがnullの場合にのみ、初期化作業を行います。
  3. どのビューがクリックされたかを追跡し、すべてのgetViewで色を設定/リセットする必要があります。

       View getView(View convertView, int position etc)
        {
             if(convertView == null{
                 convertView = // inflate it
                 colorStatusMap.put(h.position, defaultColor);
                 convertView.findViewById(R.id.myButton).setOnClickListener(clickListener);
                 convertView.findViewById(R.id.myButton).setTag(convertView);
             }
             convertView.setBackgroundColor(colorStatusMap.get(position));
             convertView.setTag((Integer)position);
    
    
        }
    
        private OnClickListener clickListener = new OnClickListener(){
    
                  public void onClick(View v){
                    View containingView = v.getTag();
                    containingView.setBackgroundColor(Color.RED);
                    int position = (Integer)containingView.getTag();
                    colorStatusMap.put(position, Color.RED);
                  }
        }
        private HashMap<Integer, Integer> colorStatusMap = new HashMap<Integer, Integer>();
    

ps .:私はこれをすべて暗記し、実際にコンパイルしてチェックすることなく入力しましたが、実行する必要があるという考えを得ることができます。万が一、コードにエラーが発生した場合は、修正するのが楽しくなります。

于 2012-12-19T11:27:18.557 に答える
0

これを一度試してください

ここに小さなコードがあります: ブール配列リストを作成します。

private ArrayList<Boolean> item_clicked = new ArrayList<Boolean> ();

次に、コンストラクターで、クリックされたすべての行要素の状態を false に設定します。

for (int i=0; i < no_of_elements.size(); i++) {
    item_clicked.add(i, false);
}

行がクリックされたときの実際のクリック状態を設定します: myButton.setOnclickListener( new OnClickListener(){

       public void onClick(View v){
         item_clicked.set(position, true);
         View containingView = myButton.getTag();
         containingView.setBackgroundColor(Color.RED);
       }


  });

getview メソッドでこの条件を指定します

if (item_clicked.get(position)) {
//SET BACKGROUD AS RED
} else {
// SET BACKGROUND AS NORMAL COLOR
}
于 2012-12-19T12:12:46.193 に答える
0

ViewHolder パターンを使用します。

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);
            holder = new ViewHolder();
            holder.button = (Button)convertView.findViewById(R.id.button);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        holder.button.setOnclickListener(new OnClickListener(){

           public void onClick(View v){
             v.setBackgroundColor(Color.RED);
           }


      });

        return convertView;
    }

private class ViewHolder{
   public Button button;
}
于 2012-12-19T11:11:33.417 に答える
0

手動で設定する必要があります。次に、赤い位置をホルダーなどに保存し、正しい色を選択することを確認します。

于 2012-12-19T11:14:07.810 に答える