Java 在listview android中多次单击

Java 在listview android中多次单击,java,android,listview,Java,Android,Listview,我正在做一个应用程序,显示一个数据库用户。我想添加不同的操作取决于每个元素中的单击区域 这是我的列表视图的实际代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wra

我正在做一个应用程序,显示一个数据库用户。我想添加不同的操作取决于每个元素中的单击区域

这是我的列表视图的实际代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/logo"
        android:layout_width="100px"
        android:layout_height="100px"
        android:layout_marginLeft="5px"
        android:layout_marginRight="20px"
        android:layout_marginTop="5px"
        android:src="@drawable/icondatabase" >
    </ImageView>

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="0.91"
        android:text="Not users"
        android:textSize="70px" />

    <ImageView
        android:id="@+id/imageAction"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_gravity="center"/>

</LinearLayout>

这是创建列表的类:

public class UsersArrayAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;
    private final List<Bitmap> listImages;
    private final String process;

    public UsersArrayAdapter(Context context, String[] values,
            List<Bitmap> listImages, String process) {
        super(context, R.layout.users, values);
        this.context = context;
        this.values = values;
        this.listImages = listImages;
        this.process = process;
    }

    public UsersArrayAdapter(Context context, String[] values) {
        super(context, R.layout.users, values);
        this.context = context;
        this.values = values;
        this.listImages = null;
        this.process = "";

    }

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

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.users, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.logo);
        ImageView imageView2 = (ImageView) rowView
                .findViewById(R.id.imageAction);
        textView.setText(values[position]);
        if (listImages == null) {
            imageView.setImageResource(R.drawable.iconenroll);
        } else {
            imageView.setImageBitmap(listImages.get(position));

            if (process.compareTo("users") == 0) {

                imageView2.setImageResource(android.R.drawable.ic_menu_delete);
            }

            if (process.compareTo("verify") == 0) {
                imageView2.setImageResource(android.R.drawable.ic_media_play);
            }
        }

        return rowView;
    }
}
public类UsersArrayAdapter扩展了ArrayAdapter{
私人最终语境;
私有最终字符串[]值;
私人最终名单;
私有最终字符串处理;
public UsersArrayAdapter(上下文上下文,字符串[]值,
列表图像,字符串处理){
super(上下文、R.layout.users、值);
this.context=上下文;
这个值=值;
this.listImages=listImages;
这个过程=过程;
}
public UsersArrayAdapter(上下文上下文,字符串[]值){
super(上下文、R.layout.users、值);
this.context=上下文;
这个值=值;
this.listImages=null;
这个过程=”;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图行视图=充气机。充气(R.layout.users,parent,false);
TextView TextView=(TextView)rowView.findViewById(R.id.label);
ImageView=(ImageView)rowView.findViewById(R.id.logo);
ImageView imageView2=(ImageView)行视图
.findviewbyd(R.id.imageAction);
setText(值[位置]);
如果(listImages==null){
setImageResource(R.drawable.iconenroll);
}否则{
setImageBitmap(listImages.get(position));
if(process.compareTo(“用户”)==0){
imageView2.setImageResource(android.R.drawable.ic_菜单_删除);
}
if(process.compareTo(“verify”)==0){
imageView2.setImageResource(android.R.drawable.ic_media_play);
}
}
返回行视图;
}
}
如果用户在imageaction中单击执行某些操作,如果在textview中单击执行其他操作,我该如何处理


谢谢

您可以为textview和imageview设置onclicklisteners。但是您必须使用视图持有者

static class ViewHolder{
    ImageView imageone;
    ImageView imagetwo;
    TextView tvone;
}

 in the adapter getview

 final ViewHolder holder;
 if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.custom_view_new, null);
        holder = new ViewHolder();
        ........
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }



holder.imageone.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

                // do ur work 
              }
         }

      holder.tvone.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

                // do ur work 
              }
         }

默认情况下,textView不可单击,您必须在textView中设置
android:clickable=“true”

    textView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO 
        }
    });

    imageView2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO 
        }
    });
试试这个:

static class ViewHolder {
    public TextView searchpageNameTextView;
    public ImageView ivStar;
  }
内部getView方法:

    View rowView = convertView;
    // reuse views
    if (rowView == null) {
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
      rowView = inflater.inflate(R.layout.demo, null);
      // configure view holder
      ViewHolder viewHolder = new ViewHolder();
      viewHolder.searchpageNameTextView = (TextView) rowView.findViewById(R.id.tvName);
      viewHolder.ivStar = (ImageView) rowView.findViewById(R.id.ivgstar);
      rowView.setTag(viewHolder);
    }

  final ViewHolder holder = (ViewHolder) rowView.getTag();
  holder.searchpageNameTextView.setText(text you want to set);  
  holder.image.setImageBitmap(your bitmap);

  holder.searchpageNameTextView.setOnClickListener(do your stuffs);
  holder.image.setOnClickListener(do your stuffs);

  return rowView;

以上代码运行良好。我在我的应用程序中实现了它。

您可以在自定义BaseAdapter的getView()中为相应元素设置ClickListeners:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.search_result_item, null);
        }
        final int fPos=position;
        ImageView image1=(ImageView)convertView.findViewById(R.id.img1);
        TextView tv1=(TextView)convertView.findViewById(R.id.tv1);
        image1.setOnClickListener(new onClickListener(){
           @Override
           public void onClick(View v) {
              Log.i("CustomAdapter", "List item "+ fPos +" had it's image clicked");
           }
        });   
        tv1.setOnClickListener(new onClickListener(){
           @Override
           public void onClick(View v) {
              Log.i("CustomAdapter", "List item "+ fPos +" had it's text view clicked");
           }
        }); 
        return convertView;
    }
遗憾的是,设置这些视图的
onClick
方法会使列表行本身不可点击,因为它们占据了所有焦点。如果您希望整行都可以单击,并使用
ListView
onItemClickListener
进行单独操作,则必须将
android:DegenantFocusability=“BlocksDescents”
标记添加到imageview/textview的父布局并设置

 android:focusable="false"
 android:focusableInTouchMode="false"

对于xml格式的
ImageView
TextView

为什么不使用viewholder就不能设置OP?平滑滚动。假设转换视图!=空,如果为空,则必须膨胀viewholder持有的视图,并将viewholder设置为标记。如果考虑性能,则应建议。你已经告诉OP,他必须这么做,这是不正确的。