简体   繁体   English

在自定义ListView Android中单击更改图像

[英]Change image on click in custom listview Android

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. 任何帮助将不胜感激。

Adapter based views like ListView recycles its views to save resources. 基于适配器的视图(例如ListView回收其视图以节省资源。 During scrolls, ListView will recycle views that are no more visible. 在滚动过程中,ListView将回收不再可见的视图。 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/ 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. 因此,在您的getView()方法中注册onClick可能不是一个好主意。 Instead use the setOnItemClickListener() method on your ListView. 而是在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);

        }
    });

In your posted code you have ImageView image which belongs to your adapter, and therefore "global" to your list. 在您发布的代码中,您具有属于适配器的ImageView image ,因此属于列表的“全局”。

Instead, what you seem to want is to have onClick handler for each individual list item. 相反,您似乎想要的是每个单独的列表项都有onClick处理程序。

For this I recommend you to implement OnItemClickListener for you listView, 为此,我建议您为listView实现OnItemClickListener

or alternatively you could change your onClick code 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.img as it is currently commented out. 并且不要忘记初始化目前已注释掉的holder.img

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. 还可以使用if-else条件使用此方法来填充列表视图。 I have aaded that in code. 我已经在代码中添加了。

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. 希望你明白我的意思。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM