Java 单击自定义列表视图 Android 时更改图像

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22909073/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 18:52:09  来源:igfitidea点击:

Change image on click in custom listview Android

javaandroideclipselistview

提问by zek

In my custom listview I want to change Image when the image is clicked. But currently when I click on Image, last row image is changed not the one on which I clicked. My customAdapter classis below:

在我的自定义列表视图中,我想在单击图像时更改图像。但是目前当我单击图像时,最后一行图像被更改而不是我单击的图像。我的 customAdapter 类如下:

package com.zek.androidvoicechanger;

import java.util.List;

import org.w3c.dom.Text;

import android.app.Activity;
import android.content.Context;
import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

public class CustomAdapter extends ArrayAdapter<Items> {

    Context context;
    ImageView image ;


//  int[] Radio = { R.drawable.play, R.drawable.pause };

    public CustomAdapter(Context context, int resourceId, List<Items> items) {
        super(context, resourceId, items);
        this.context = context;
    }

    private class ViewHolder {
        // ImageView imageView;

        TextView txtTitle;
//      ImageView img;

    }

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

        ViewHolder holder = null;

        Items rowItem = getItem(position);

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

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.custom_list, null);
            holder = new ViewHolder();

            holder.txtTitle = (TextView) convertView
                    .findViewById(R.id.textView1);
//          holder.img = (ImageView) convertView.findViewById(R.id.imageView2);
            image = (ImageView) convertView.findViewById(R.id.imageView2);
        //  holder.rdo = (RadioButton) convertView.findViewById(R.id.radioButton1);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        holder.txtTitle.setText(rowItem.getTitle());

        image.setImageResource(rowItem.getImageId());
        image.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(context, "image clicked", 1000).show();
                if(position==0){
                image.setImageResource(R.drawable.pause);
                }
                AudioListner.playRecord(position);

            }
        });



    //holder.rdo.setTag(position);
//      holder.rdo.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//          
//          @Override
//          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//
//          
//              
//          }
//      });

//      rdo.setOnClickListener(new OnClickListener() {
//
//          @Override
//          public void onClick(View v) {
//
//              
//              if(position==0){
//                  rdo.indexOfChild(findViewById(isEnabled(position)));
//                  Toast.makeText(context, "image clicked", 1000).show();
//                  rdo.setBackgroundResource(R.drawable.pause);
//                  AudioListner.playRecord(position);
//                  
//              }
//              
//              
//              
//              if (rdo.isClickable()) {
//                  rdo.setBackgroundResource(R.drawable.pause);
//                  Toast.makeText(context, "image clicked", 1000).show();
//
//                  //Radio[1] = 1;
//                  AudioListner.playRecord(position);
//                  
//              } else {
//              //  rdo.setBackgroundResource(R.drawable.play);
//                  Toast.makeText(context, "image not clicked", 1000).show();
//
//              }
////
//          }
//      });

        return convertView;
    }

}

Any help will be appreciated.

任何帮助将不胜感激。

采纳答案by Saket

Adapter based views like ListViewrecycles its views to save resources. During scrolls, ListView will recycle views that are no more visible. This post by Lucas is a great place to learn more about its working: http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

基于适配器的视图,例如ListView回收其视图以节省资源。在滚动期间,ListView 将回收不再可见的视图。Lucas 的这篇文章是了解有关其工作的更多信息的好地方:http: //lucasr.org/2012/04/05/performance-tips-for-androids-listview/

So registering onClick in your getView()method might not be a very good idea. Instead use the setOnItemClickListener()method on your ListView.

因此,在您的getView()方法中注册 onClick可能不是一个好主意。而是在 ListView 上使用setOnItemClickListener()方法。

To accomplish what you're trying to do, you can do this:

要完成您想要做的事情,您可以这样做:

Edit: Updated my code as per your comment.

编辑:根据您的评论更新了我的代码。

mYourListView..setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(context, "Item #" + position + " clicked", Toast.LENGTH_SHORT).show();

            // here, "position" is the position of your item and "id" is your
            // item's id in your data set.

            // mLastClickedPosition is a member field of type long which 
            // stores the position of the most recently clicked item, 
            // initially set to -1
            if(mLastClickedPosition != -1){
                  // do something to pause the item in your list at this position
            }

            // next, update mLastClickedPosition
            mLastClickedPosition = position

            // find the image in your view and update it
            if(position==0){
                  ImageView imageView = view.findViewById(R.id.your_image);
                  imageView.setImageResource(R.drawable.pause);
            }

            // play audio
            AudioListner.playRecord(position);

        }
    });

回答by Vikram Singh

For this you have to maintain the position of clicked row. You can do this by creating an array. Everytime you click on a row image, you can add this row's position into this array. Also use this arrray to populate your listview using if-else condition. I have aaded that in code.

为此,您必须保持点击行的位置。你可以通过创建一个数组来做到这一点。每次单击行图像时,都可以将此行的位置添加到此数组中。还可以使用此数组使用 if-else 条件填充您的列表视图。我已经在代码中添加了这一点。

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

        ViewHolder holder = null;

        Items rowItem = getItem(position);

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

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.custom_list, null);
            holder = new ViewHolder();

            holder.txtTitle = (TextView) convertView
                    .findViewById(R.id.textView1);
//          holder.img = (ImageView) convertView.findViewById(R.id.imageView2);
            image = (ImageView) convertView.findViewById(R.id.imageView2);
        //  holder.rdo = (RadioButton) convertView.findViewById(R.id.radioButton1);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();


        if(yourSelectedImageArray.contains(position)){

         image.setImageResource(R.drawable.pause);//your clicked image
        }else{
        image.setImageResource(rowItem.getImageId());//your default image
        }
        holder.txtTitle.setText(rowItem.getTitle());

        //image.setImageResource(rowItem.getImageId());
        image.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(context, "image clicked", 1000).show();
                if(position==0){ //not sure about this logic..
                yourSelectedImageArray.add(position);//add the clicked position into an                       array.
                image.setImageResource(R.drawable.pause);
                }
                AudioListner.playRecord(position);

            }
        });

    return convertView;
}

also dont forget to remove position from this array when you click on any other row. Hope you got my point.

当您单击任何其他行时,也不要忘记从此数组中删除位置。希望你明白我的意思。

回答by kiruwka

In your posted code you have ImageView imagewhich belongs to your adapter, and therefore "global" to your list.

在您发布的代码中,您拥有ImageView image属于您的适配器,因此“全局”到您的列表中。

Instead, what you seem to want is to have onClickhandler for each individual list item.

相反,您似乎想要的是onClick为每个单独的列表项设置处理程序。

For this I recommend you to implement OnItemClickListenerfor you listView,

为此,我建议您为 listView实现OnItemClickListener

or alternatively you could change your onClickcode to something like :

或者,您可以将onClick代码更改为:

    // set onClick for each img in the list
    holder.img.setOnClickListener(new OnClickListener() { 

        @Override
        public void onClick(View v) {
            ((ImageView) v).setImageResource(R.drawable.pause);
        }
    });

and don't forget to initialize holder.imgas it is currently commented out.

并且不要忘记初始化,holder.img因为它当前已被注释掉。