どのようにArrayAdapterのgetViewメソッド内のビューを更新するのですか?

私は次の問題があります。 ArrayAdapter クラスを拡張したカスタムアダプタを使用しています。それぞれの行には Button があります。クリックするとそのスタイルを変更する必要があります。

これまで私は持っている:

public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;

        if (convertView == null) {  
            vi = inflater.inflate(R.layout.people_item, null);

            mViewHolder = new ViewHolder();              
            mViewHolder.follow = (Button) vi.findViewById(R.id.people_item_btn_follow);
            mViewHolder.name = (TextView)....
            vi.setTag(mViewHolder);         
        } else {
            mViewHolder = (ViewHolder) convertView.getTag();
        }

        mViewHolder.follow.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
               //Changing the style of the button
                if(mData[position].getFollow().equals("0")) {
                    mViewHolder.follow.setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.unfollow_button_border));
                    mViewHolder.follow.setText(mCtx.getString(R.string.unfollow));
                } else {
                    mViewHolder.follow.setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.follow_button_border));
                    mViewHolder.follow.setText(mCtx.getString(R.string.follow));
                }

                mSharedAsyncTasks.getFollowerTask().execute(mData[position].getId());
            }
        });

        if(mData[position] != null) {
           //Setting data
        }

        return vi;
    }

private static class ViewHolder {
    TextView fullName;
    Button follow;
}

問題は、任意の行のボタンをクリックすると、新しいスタイルが別の行のボタンに適用されることです(ただし、次の効果が右の行に適用されます)。

私はそれが行がリサイクル/再利用されているという事実と関係していることを知っています。

しかし、実際にこれを解決する方法は?

ありがとう!

1

1 答え

あなたが次のことをしたいとは思わない。

 public void onClick(View v) {
      mViewHolder.follow.setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.unfollow_button_border));
      ...
 }

具体的には、あなたの参照mViewHolderはそのように見える問題で、スクロールするときに任意のボタンを指すことができます。その問題を解決するには、次のような問題があります。 onClick(View v)vは、あなたがクリックしたボタンだと思います。

代わりに、次のことができるはずです

 public void onClick(View v) {
      ((Button)v).setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.unfollow_button_border));
      ...
 }
1
追加された
もちろん!!エミールありがとう!
追加された 著者 Amokrane Chentir,