使用自定义适配器更改 ListView 中特定行中的 ImageView

Posted

技术标签:

【中文标题】使用自定义适配器更改 ListView 中特定行中的 ImageView【英文标题】:Changing ImageView in a specific row in ListView with custom adapter 【发布时间】:2019-09-16 16:46:17 【问题描述】:

我正在尝试更改 ListView 中特定行中的 ImageView 使用自定义适配器。

每当我更改一行时,其他行也会受到影响。 我会很感激你的帮助。 谢谢你。 这是我在 MainActivity 类中的代码

adapter= new CustomAdapter(dataModels,getApplicationContext());

listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        Toast.makeText(MainActivity.this, position+" ",
                    Toast.LENGTH_LONG).show();

        DataModel dataModel= dataModels.get(position);
        Snackbar.make(view, dataModel.getName()+"\n"+dataModel.getType(), Snackbar.LENGTH_LONG)
                    .setAction(" ", null).show();

        ImageView imgv = (ImageView)view.findViewById(R.id.item_info);
        imgv.setImageResource(R.drawable.fav);

        adapter.notifyDataSetChanged();

        i= Integer.parseInt(dataModel.getVersion_number());
        rotate();
        StartNewSong();

    
);

这里是自定义适配器中的代码

public View getView(int position, View convertView, ViewGroup parent) 
    // Get the data item for this position
    DataModel dataModel = getItem(position);
    // Check if an existing view is being reused, otherwise inflate the view

    final View result;

    if (convertView == null) 


        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.row_item, parent, false);

        viewHolder.txtName = (TextView) convertView.findViewById(R.id.name);

        viewHolder.txtType = (TextView) convertView.findViewById(R.id.type);

        viewHolder.info = (ImageView) convertView.findViewById(R.id.item_info);

        result=convertView;

        convertView.setTag(viewHolder);
     else 
        viewHolder = (ViewHolder) convertView.getTag();
        result=convertView;
    

    Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
    result.startAnimation(animation);
    lastPosition = position;


    viewHolder.txtName.setText(dataModel.getName());
    viewHolder.txtType.setText(dataModel.getType());
    check = dataModel.getImageApp();
    if (check == "false") 

     else if (check !="false") 
        Picasso.get()
               .load(check)
               .placeholder(R.mipmap.ic_launcher)
               .error(R.mipmap.ic_launcher)
               .into(viewHolder.info);
    

    viewHolder.info.setOnClickListener(this);
    viewHolder.info.setTag(position);

    // Return the completed view to render on screen
    return convertView;

这是显示为 gif 的问题 problem as a gif

我的数据模型类

公共类数据模型

String name;
String type;
String id;
String imageApp;
String url;


public DataModel(String name, String type, String id, String imageApp, String url) 
    this.name=name;
    this.type=type;
    this.id=id;
    this.imageApp=imageApp;
    this.url=url;




public String getName() 
    return name;



public String getType() 
    return type;



public String getVersion_number() 
    return id;

public String getImageApp() 
    return imageApp;

public String getUrl() 
    return url;
 

【问题讨论】:

这里是什么imageApp 【参考方案1】:

在您的 DataModel 类中创建一个名为 isSelected 的布尔变量,并按如下方式更改您的构造函数。

public DataModel(String name, String type, String id, String imageApp, String url, boolean isSelected) 
    this.name=name;
    this.type=type;
    this.id=id;
    this.imageApp=imageApp;
    this.url=url;
    this.isSelected = isSelected;

这将用于确定是否选择了一个项目。 为isSelected 创建getter 和setter。 当您创建 DataModel 对象时,将 isSelected 作为 false 传递给您的构造函数。

在您的适配器中检查isSelected 的值以设置相应的图像。

if (dataModel.isSelected) 
    Picasso.get()
           .load(your_selected_imageview)
           .placeholder(R.mipmap.ic_launcher)
           .error(R.mipmap.ic_launcher)
           .into(viewHolder.info);

并且在您的列表视图的项目单击侦听器中不要更改imageview,而只需将相应DataModel 对象的isSelected 值设置为true。

DataModel dataModel = dataModels.get(position);
dataModel.setIsSelected(true);
adapter.notifyDataSetChanged();

【讨论】:

它仍然改变不止一个原始文件 能否请您发布您的DataModel 课程

以上是关于使用自定义适配器更改 ListView 中特定行中的 ImageView的主要内容,如果未能解决你的问题,请参考以下文章

异步更改 ListView 中的特定项目

如何在不使用自定义适配器的情况下从 ListView 获取特定的 TextView (View)?

在自定义适配器类中发送服务器请求后,如何更改 Listview 按钮名称?

在listview中的addTextChangedListener中使用自定义列表适配器

EditText.SetText() 在自定义适配器中更改我的软键盘输入类型

ListView 自定义适配器对错误的项 OnScroll 应用操作