交换列表视图项中的图标

时间:2019-01-02 16:23:59

标签: java android

我正在尝试根据商品数据更改图标图像。按下图标时,应切换到其他图标并更改项目数据。一切正常,但是当我向上或向下滚动新图标图像时,将其位置更改为其他项目,因为我使用带适配器的列表视图。如何在不与其他项目混合的情况下将新图标保留在按下的项目中。

package com.example.sairamkrishna.handymade;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class HandAdapter extends ArrayAdapter<HandClass> {
    private int myColor;

    public HandAdapter(Context context, ArrayList<HandClass> objects, int my_Color) {
        super(context, 0, objects);
        myColor = my_Color;

    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View myView = convertView;
        final HandClass myData = getItem(position);

        if (myView == null) {
            myView = LayoutInflater.from(getContext()).inflate(
                    R.layout.label_item, parent, false);

        }

        ImageView aImage = (ImageView) myView.findViewById(R.id.itemImage);
        aImage.setImageResource(myData.getClsImage());

        TextView aName = (TextView) myView.findViewById(R.id.itemName);
        aName.setText(myData.getClsName());

        FrameLayout aColor = (FrameLayout) myView.findViewById(R.id.itemColor);
        aColor.setBackgroundColor(myColor);

        final ImageView aAddToBasket = (ImageView) myView.findViewById(R.id.itemAddToBasket);
        aAddToBasket.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Boolean aClsToBasket = (Boolean) myData.getClsToBasket();

                if (aClsToBasket) {
                    aAddToBasket.setImageResource(R.drawable.ic_add_circle);
                    myData.setClsToBasket(false);
                    Toast.makeText(getContext(), "Remove from basket"+ position, Toast.LENGTH_SHORT).show();

                } else {
                    // if (!aClsToBasket) {
                    aAddToBasket.setImageResource(R.drawable.ic_remove_circle);
                    myData.setClsToBasket(true);
                    Toast.makeText(getContext(), "Add to basket"+ position, Toast.LENGTH_SHORT).show();
                }
            }
        });

        ImageView aAddToFavorite = (ImageView) myView.findViewById(R.id.itemAddToFavorite);
        aAddToFavorite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getContext(), "Favorite - List item was clicked at " + position, Toast.LENGTH_SHORT).show();
            }
        });
        return myView;
    }
}

2 个答案:

答案 0 :(得分:1)

ListView和RecyclerView的基本概念是,您需要getView()或{{1}每次,对行的每个部分进行“更新”值(在这种情况下为图像) {1}}被调用。

例如,每次调用onBindViewHolder()时,您总是在更新getView()的(文本)值。也就是说,始终有{em> 呼叫TextView aName

现在,您唯一一次呼叫aName.setText()是在aAddToBasket.setImageResource()内部。当然,在这里这样做很有意义,但是您还必须在侦听器外部更新图像。

在您的OnClickListener行之后添加此代码:

ImageView aAddToBasket

答案 1 :(得分:0)

在图标更改后添加此行。

adapter.notifyDataSetChanged();