【问题标题】:Change image on click in custom listview Android在自定义列表视图 Android 中单击更改图像
【发布时间】:2014-04-07 09:55:49
【问题描述】:

在我的自定义列表视图中,我想在单击图像时更改图像。 但是目前当我单击图像时,最后一行图像已更改,而不是我单击的图像。 我的 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;
    }

}

任何帮助将不胜感激。

【问题讨论】:

  • 您拥有属于您的适配器的ImageView image,并且您不处理单个列表项的点击。请看下面我的回答

标签: java android eclipse listview


【解决方案1】:

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

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

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

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

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);

        }
    });

【讨论】:

  • 谢谢你们所有人,这真的很有帮助。它正在工作,但我有一个真正的问题是我想更改列表中每个图像视图的图像,单击它并希望将它们全部保持在以前的状态。示例播放和暂停。如果我播放一个项目,它的图标将更改为暂停图标,当我点击另一个图标时,它也改变了暂停状态,我一次播放一个,其余的处于暂停状态..我该如何处理..?
  • @zek,这很容易做到。只需使用额外的成员字段来跟踪最后单击项目的位置。查看我的编辑。
【解决方案2】:

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

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

为此我建议你为你的listView实现OnItemClickListener

或者您也可以将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);
        }
    });

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

【讨论】:

    【解决方案3】:

    为此,您必须保持单击行的位置。您可以通过创建一个数组来做到这一点。每次单击行图像时,都可以将该行的位置添加到该数组中。还可以使用此数组使用 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;
    }
    

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

    【讨论】:

    • 维护一个单独的数据结构来跟踪点击的行项目不是一个很好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多