Android 具有多个可单击项的ListView适配器

Android 具有多个可单击项的ListView适配器,android,listview,onclick,adapter,Android,Listview,Onclick,Adapter,我是android新手。我有一个带有 Image1 | Name | Image2 | Layout1 | Image3 当我点击Image2时,Image2的图像应该改变,Image1的背景应该改变 我面临的问题是,如果在列表视图中有3个可见项,则单击第一个项的图像2即使在第四个项的图像中也会发生变化。如何解决这个问题,应该使用什么方法 我在下面发布我的代码 public class RecipeListAdapter extends BaseAdapter{ Context mConte

我是android新手。我有一个带有

Image1 | Name | Image2 | Layout1 | Image3
当我点击
Image2
时,
Image2
的图像应该改变,
Image1
的背景应该改变

我面临的问题是,如果在
列表视图中有3个可见项,则单击第一个项的图像2即使在第四个项的图像中也会发生变化。如何解决这个问题,应该使用什么方法

我在下面发布我的代码

public class RecipeListAdapter extends BaseAdapter{

Context mContext;
ArrayList<CategoryDetails> categoryDetails;
View.OnClickListener clickListener;

public RecipeListAdapter(Context mContext, ArrayList<CategoryDetails> categoryDetails) {
    this.mContext = mContext;
    this.categoryDetails = categoryDetails;
}

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

@Override
public Object getItem(int i) {
    return categoryDetails.get(i);
}

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

@Override
public View getView(final int i, View convertView, ViewGroup viewGroup) {

    ViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) mContext
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.main_recycler_layout, null);
        holder = new ViewHolder();
        holder.recipeImage = (ImageView) convertView.findViewById(R.id.recipe_img);
        holder.chowImage = (ImageView) convertView.findViewById(R.id.chow_image);
        holder.recipeText = (TextView) convertView.findViewById(R.id.recipe_txt);
        holder.likeBasket = (TextView) convertView.findViewById(R.id.like_bsk);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.recipeText.setText(categoryDetails.get(i).getRecipeName());

    String imageUrl = Constants.BASE_URL + categoryDetails.get(i).getRecipeImage();
    Picasso.with(mContext)
            .load(imageUrl)
            .placeholder(R.drawable.category_default)
            .into(holder.recipeImage);

    holder.likeBasket.setText(categoryDetails.get(i).getBookmarkCount());
    holder.chowImage.setTag(i);


final ViewHolder finalHolder = holder;
    holder.chowImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            view.setVisibility(View.GONE);
            finalHolder.likeBasket.setBackgroundColor(Color.parseColor("#000000"));
        }
    });

    return convertView;
}


class ViewHolder{
    ImageView recipeImage;
    ImageView chowImage;
    TextView recipeText;
    TextView likeBasket;
}
}
公共类RecipeListAdapter扩展BaseAdapter{
语境;
ArrayList类别详细信息;
View.OnClickListener单击listener;
公共RecipeListAdapter(上下文mContext、ArrayList categoryDetails){
this.mContext=mContext;
this.categorydeails=categorydeails;
}
@凌驾
public int getCount(){
返回categoryDetails.size();
}
@凌驾
公共对象getItem(int i){
返回categoryDetails.get(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
公共视图getView(最终int i、视图转换视图、视图组视图组){
ViewHolder=null;
LayoutInflater mInflater=(LayoutInflater)mContext
.getSystemService(活动.布局\充气机\服务);
if(convertView==null){
convertView=mInflater.充气(R.layout.main\u recycler\u layout,空);
holder=新的ViewHolder();
holder.recipeImage=(ImageView)convertView.findViewById(R.id.recipe\u img);
holder.chowImage=(ImageView)convertView.findViewById(R.id.chow_image);
holder.recipeText=(TextView)convertView.findViewById(R.id.recipe_txt);
holder.likeBasket=(TextView)convertView.findViewById(R.id.like_bsk);
convertView.setTag(支架);
}否则
holder=(ViewHolder)convertView.getTag();
holder.recipeText.setText(categoryDetails.get(i.getRecipeName());
字符串imageUrl=Constants.BASE_URL+categoryDetails.get(i).getRecipeImage();
毕加索(McContext)
.load(图像URL)
.占位符(R.drawable.category\u默认值)
.进入(持票人、收款人);
holder.likeBasket.setText(categorydeails.get(i.getBookmarkCount());
holder.chowImage.setTag(一);
最终视图持有者finalHolder=持有者;
holder.chowImage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
view.setVisibility(view.GONE);
finalHolder.likeBasket.setBackgroundColor(Color.parseColor(“#000000”);
}
});
返回视图;
}
类视图持有者{
图像视图;
图像视图;
文本视图recipeText;
文本视图likeBasket;
}
}

如果没有任何代码,我想您会看到视图1在位置4中循环。由于在任何时间只有3项可见

如果是这样的话,问题是当“convertView”不为null时,您没有在适配器中初始化视图

编辑: 我打赌问题出在最终的视图持有者finalHolder中。 在这种情况下,尝试使用“convertView”并打破ViewHolder模式,因为此更改不会带来性能问题

holder.chowImage.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        view.setVisibility(View.GONE);
        convertView.findViewById(R.id.like_bsk).setBackgroundColor(Color.parseColor("#000000"));
    }
});

请出示你的密码。