0

カスタム アダプターを使用したリスト ビューがあります。カスタム アダプターは、TextView と 2 つの ImageButtons だけです。ImageButton がクリックされると、その画像が切り替わります。ただし、これは機能しますが、下にスクロールすると、ランダムなアイテムも切り替えられます。

だから、画面上のアイテムの位置の相対性に関係していると思いました。そのため、リスト ビュー内の位置に対応する各 ImageButton にタグを割り当てました。次に、次のコードを使用して、必要なアイテムを正しく選択します。

    int firstVisiblePos = listView.getFirstVisiblePosition();
    int viewPos = 0;
    int position = Integer.parseInt(v.getTag().toString());
    Toast.makeText(this, v.getTag().toString(), Toast.LENGTH_SHORT).show();
    for (int i = 0; i < listView.getChildCount(); i++) {
        viewPos = firstVisiblePos + i;
        if (viewPos == position) {              
            relativeLayout = (RelativeLayout) listView.getChildAt(position);
            break;
        }
    }

それでも、私はまだ同じ行動を経験しています。どんな助けでも大歓迎です。

更新:

public class CustomAdapter extends BaseAdapter {
private ArrayList<String> data;
private Activity myActivity;
private LayoutInflater inflater;

public CustomAdapter(Activity activity, ArrayList<String> data) {
    this.myActivity = activity;
    this.data = data;
    this.inflater = (LayoutInflater) myActivity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return data.size();
}

@Override
public Object getItem(int position) {
    return data.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_row, null);
    }

    TextView proverb = (TextView) convertView.findViewById(R.id.title);
    proverb.setText(data.get(position));
    proverb.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14);
    proverb.setTypeface(MainActivity.tf, 1);
    ImageButton favBtn = (ImageButton) convertView.findViewById(R.id.btn_favorite);
    if(MainActivity.favorites.contains(data.get(position))){
        // favorite, set fav icon
        favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));         
    }       
    favBtn.setTag(position);
    return convertView;
}

}

4

3 に答える 3

1

問題は、ユーザーがリストビューをスクロールするときにリスト項目が再利用されることです。したがって、毎回データに基づいてリスト項目を再構築する必要があります。お気に入りであれば画像を変更しているように見えますが、お気に入りでなければ元に戻すわけではありません。

変更してみてください

if(MainActivity.favorites.contains(data.get(position))){
    // favorite, set fav icon
    favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));         
}

if(MainActivity.favorites.contains(data.get(position))){
    // favorite, set fav icon
    favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));         
} else {
    // not favorite, set default icon
    favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.notfav));
}

画像ボタンをクリックすると追加data.get(position)されMainActivity.favorites、もう一度クリックすると削除されると想定しています。

于 2013-11-01T06:27:58.140 に答える