GVKun编程网logo

如何使多个listview响应不同的onItemClickListener?(listview多种item)

25

在这里,我们将给大家分享关于如何使多个listview响应不同的onItemClickListener?的知识,让您更了解listview多种item的本质,同时也会涉及到如何更有效地AndroidF

在这里,我们将给大家分享关于如何使多个listview响应不同的onItemClickListener?的知识,让您更了解listview多种item的本质,同时也会涉及到如何更有效地Android Fragment中ListView的OnItemClickListener无效、Android ListView与OnItemClickListener和GestureDetector、Android ListView的OnItemClickListener详解、android – ListView setOnItemClickListener无法正常工作的内容。

本文目录一览:

如何使多个listview响应不同的onItemClickListener?(listview多种item)

如何使多个listview响应不同的onItemClickListener?(listview多种item)

我在扩展活动的类中使用4list视图。我必须执行其他列表项单击功能。我可以使用以下方法代码吗?那么如何设置一个onItemClickListener为多个ListViews

   public void onItemClick(AdapterView<?> adapter, View view, int index, long id)   {        switch(view.getId())       {          case <listview1 Id> : //call method 1; break;          case <listview2 Id> : //call method 2; break;          case <listview3 Id> : //call method 3; break;       }   }

答案1

小编典典

为不同的列表视图设置不同的适配器。我以两个列表视图为例。因此,请为这两个安装两个适配器。并且setOnItemClick(context)将如下所示。

 public void onItemClick(AdapterView<?> adv, View v, int arg2, long arg3) {    // TODO Auto-generated method stub    switch(adv.getId()) {        case R.id.ListView1:            Toast.makeText(this, "list1", Toast.LENGTH_LONG).show();            break;        case R.id.ListView2:            Toast.makeText(this, "list2", Toast.LENGTH_LONG).show();            break;    }}

Android Fragment中ListView的OnItemClickListener无效

Android Fragment中ListView的OnItemClickListener无效

    人可能会变,但代码不一样,一个地方出错说不执行就是不执行。

    网上说是ListView的 OnItemClick监听失效的原因。还有网上给出的解决方案是把加载ListView数据的每一项都加上

android:focusable="false"

然后一切问题就OK 了。

因为点击的焦点被ListView列表里的其他控件给获取了,所以就出现未反应情况。

Android ListView与OnItemClickListener和GestureDetector

Android ListView与OnItemClickListener和GestureDetector

我有一个以下ListActivity:
public class ShowDayActivity extends ListActivity implements OnItemClickListener {
    private GestureDetector gestureDetector;
    private View.OnTouchListener gestureListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.day);
        registerForContextMenu(getListView());

        gestureDetector = new GestureDetector(new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v,MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        };

        getListView().setonItemClickListener(this);
        getListView().setonTouchListener(gestureListener);
    }

    @SuppressWarnings("static-access")
    @Override
    public boolean onoptionsItemSelected(MenuItem item) {
        ...
        return super.onoptionsItemSelected(item);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        ...
        return super.onContextItemSelected(item);
    }

    Override
    public void onItemClick(AdapterView<?> parent,View v,int pos,long id) {
        editEvent(pos);
    }

    class MyGestureDetector extends SimpleOnGestureListener {
        private static final int SWIPE_MIN_disTANCE = 120;
        private static final int SWIPE_MAX_OFF_PATH = 250;
        private static final int SWIPE_THRESHOLD_VELociTY = 200;

        @Override
        public boolean onFling(MotionEvent e1,MotionEvent e2,float veLocityX,float veLocityY) {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
               return false;
            }
            // right to left swipe
            if (e1.getX() - e2.getX() > SWIPE_MIN_disTANCE && Math.abs(veLocityX) > SWIPE_THRESHOLD_VELociTY) {
                Log.d("ICS-Calendar","Fling left");
                return true;
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_disTANCE && Math.abs(veLocityX) > SWIPE_THRESHOLD_VELociTY) {
                Log.d("ICS-Calendar","Fling right");
                return true;
            }

            return false;
        }
    }   
}

listItems上的contextListener(long-click)完美地工作.今天我添加了gestureListener和Detector,它也是这样,但是:

GestureDetector检测到一切都没有了,但是在完成了逻辑之后,会打开上下文菜单,这显然不是我想要的.任何想法我做错了,还是我可以做什么?

解决方法

通常,您需要调用cancelLongPress()方法,并检测到onFling后的所有视图的子项.但是对于AbsListView,这个方法什么也不做:(

但是我已经找到了解决方法:在onFling回调中,处理完所有内容后,为ListView对象执行下一步:

Event cancelEvent = Event.obtain(ev2);
cancelEvent.setAction(MotionEvent.ACTION_UP);
listView.onTouchEvent(cancelEvent);

Android ListView的OnItemClickListener详解

Android ListView的OnItemClickListener详解

我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener。本文主要在于对OnItemClickListener的position和id参数做详细的解释,我相信有些人在这上面走了些弯路。

先来看一下官方的文档

position The position of the view in the adapter.

id The row id of the item that was clicked.

而这两行字并没有解释清楚position和id的区别。另外,我们还有个Adapter的getView方法。
public abstract View getView (int position,View convertView,ViewGroup parent)
这里也有一个position。

初步接触ListView的同学,一般会直接继承ArrayAdapter,然后(比如我),就想当然的认为OnItemClick的position和getView的position是一样的啊。于是我们就getItem(position)来获取相应的数据。

那么这段代码有没有错呢?如果有错的话,在什么情况会出错呢?

第一个问题的答案是,当我们为ListView添加headerView或者footerView之后,这段代码就不一定是我们想要的了。
出现问题的原因在于,当我们为ListView添加headerView或者footerView之后,ListView在setAdapter时,做了一些事情,这导致,Adapter和OnItemClickListener中的position含义发生了变化。

我们可以来看看ListView中setAdapter的实现

public void setAdapter(listadapter adapter) { 
if (mAdapter != null && mDataSetobserver != null) { 
mAdapter.unregisterDataSetobserver(mDataSetobserver); 
} 
resetList(); 
mRecycler.clear(); 
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) { 
mAdapter = new HeaderViewlistadapter(mHeaderViewInfos,mFooterViewInfos,adapter); 
} else { 
mAdapter = adapter; 
} 

可以看出,如果这个ListView存在headerView或者footerView的话,那么会在我们传入的adapter外面在封装一层HeaderViewlistadapter,这是一个专门用来自动处理headerView和footerView的adapter。在ListView中,本身不区分headerView,footerView。ListView可以理解成是只负责管理一组View的数组的UI(ViewGroup),headerView和footerView都委托给HeaderViewlistadapter来处理。(从这里也可以看到为什么api文档中提到,addFooterView和addHeaderView要在setAdapter函数之前调用,如果在之后调用,那么就不会生成HeaderViewlistadapter,从而导致显示不出headerView和footerView)。

回到开头的问题,position和id有啥区别。为此,我们找一下position和id是怎么传进来的。

OnItemClickListener在android.widget.AdapterView的public boolean performItemClick(View view,int position,long id)函数中被调用。

performItemClick在android.widget.AbsListView.PerformClick.run() 中被调用

private class PerformClick extends WindowRunnnable implements Runnable { 
int mClickMotionPosition; 
public void run() { 
// The data has changed since we posted this action in the event queue,// bail out before bad things happen 
if (mDataChanged) return; 
final listadapter adapter = mAdapter; 
final int motionPosition = mClickMotionPosition; 
if (adapter != null && mItemCount > 0 && 
motionPosition != INVALID_<strong>POSITION</strong> && 
motionPosition < adapter.getCount() && sameWindow()) { 
final View view = getChildAt(motionPosition - mFirstPosition); 
// If there is no view,something bad happened (the view scrolled off the 
// screen,etc.) and we should cancel the click 
if (view != null) { 
performItemClick(view,motionPosition,adapter.getItemId(motionPosition)); 
} 
} 
} 
} 

可以看到,position事实上就是ListView中被点击的view的位置。注意,在ListView中是不负责处理headerView和footViewer的,所以,这个位置应该是这个被点击的view在数组[所有的headerView,用户添加的view,所有的footerView]中的位置(请自行参考HeaderViewlistadapter的getView实现)。而id是来自于adapter.getItemId(position)。
对于ArrayAdapter的getItemId函数,实现就是return position。id和position是一致的。

然而,对于HeaderViewlistadapter

public long getItemId(int <strong>position</strong>) { 
int numHeaders = getHeadersCount(); 
if (mAdapter != null && <strong>position</strong> >= numHeaders) { 
int adjposition = <strong>position</strong> - numHeaders; 
int adapterCount = mAdapter.getCount(); 
if (adjposition < adapterCount) { 
return mAdapter.getItemId(adjposition); 
} 
} 
return -1; 
} 

实现逻辑是,如果position指向了headerView或footerView,那么返回-1,否则,将返回在用户view数组的位置。
也就是说

id=position-headerView的个数(id < headerviewer的个数+用户view的个数),否则=-1

因此,OnItemClickListener的正确实现如下:

void onItemClick(AdapterViewparent,View view,int <strong>position</strong>,long id){ 
if(id == -1) { 
// 点击的是headerView或者<strong>footerView</strong> 
return; 
} 
int realPosition=(int)id; 
T item=getItem(realPosition); 
// 响应代码 
}

相关阅读:

Android 中ListView setOnItemClickListener点击无效原因分析

以上所述是小编给大家介绍的Android ListView的OnItemClickListener详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

android – ListView setOnItemClickListener无法正常工作

android – ListView setOnItemClickListener无法正常工作

就像标题所说,我的setonItemClickListener不起作用.我查看了迄今为止我所看到的所有内容,并且无法找到我的错误.

这是代码:

这是有问题的课程.它不是主类,而是从意图调用:

package...;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.listadapter;
import android.widget.ListView;

public class GroupActivity extends Activity {

    String group_id = "";
    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_group);
        context = this;

        Intent intent = getIntent();
        group_id = intent.getStringExtra("group_id");
        Log.i("bla", "Launched GroupActivity for group_id " + group_id);

        final SubAdapter adapter = new SubAdapter(this, group_id);
        ListView lv = (ListView) findViewById(R.id.listView1);
        lv.setClickable(true);
        lv.setAdapter(adapter);

        lv.setonItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> av, View v, int idx, long lidx) {
                Log.i("print here", "blaa " + idx);

            }

        });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

这是SubAdapter类:

package...;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class SubAdapter extends BaseAdapter {

    private static final int thumb_width = 128;
    private static final int thumb_hight = 128;
    private static Bitmap default_thumb = null;
    private static LayoutInflater inflater = null;
    private final String group_id_;
    private final Activity activity;
    private final SubAdapter t = this;

    // used to keep selected position in ListView
    private int selectedPos = -1;   // init value for not-selected

    public SubAdapter(Activity a, final String group_id) {
        Drawable d = a.getResources().getDrawable(R.drawable.ic_contact_picture);
        default_thumb = ((BitmapDrawable) d).getBitmap();
        activity = a;
        group_id_ = group_id;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int idx, View convertView, ViewGroup parent) {
        Log.i("bla2", "getting view with index " + idx);
        View vi = convertView;

        if (convertView == null) {
            vi = inflater.inflate(R.layout.sub_list_item, null);
            vi.setClickable(true);
        }
        TextView tv1 = (TextView)vi.findViewById(R.id.textView1);
        TextView tv2 = (TextView)vi.findViewById(R.id.textView2);
        ImageView img = (ImageView)vi.findViewById(R.id.imageView1);

        tv1.setText("first name" + " " + "last name");
        tv2.setText("some date");

        // put thumbnail
        Bitmap thumb = default_thumb;
        img.setimageBitmap(thumb);
        Log.i("bla3", "index is " + idx + "selected index is " + selectedPos);
        if(selectedPos == idx){
            Log.i("bla4", "inside if");
         }      
        return vi;
    }


    public void setSelectedPosition(int pos){
    selectedPos = pos;
         // inform the view of this change
         notifyDataSetChanged();
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

}

这是activity_group xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".GroupActivity" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusableInTouchMode="false"
        android:focusable="false" >

    </ListView>

</RelativeLayout>

这是sub_list_item xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="false" 
    android:focusableInTouchMode="false">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_margin="6dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_margin="6dp"
        android:layout_toLeftOf="@+id/toggleButton1"
        android:layout_toRightOf="@+id/imageView1"
        android:text="some text"
        android:textAppearance="?android:attr/textAppearance" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_toLeftOf="@+id/toggleButton1"
        android:text="more text"
        android:textAppearance="?android:attr/textAppearance" />

    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_margin="6dp"
        android:text="present" />

</RelativeLayout>

除了点击监听器之外,其他一切似乎都有效. SubAdapter正确打开并填充列表.
基本上我正在寻找的是获取消息“Log.i(”print here“,”blaa“idx);”打印 – 它是ListView的setonItemClickListener中的日志(见上图)

如果缺少任何其他相关代码,请与我们联系
谢谢!!!

解决方法:

你可能应该删除这个电话
vi.setClickable(真);在您的SubAdapter类中,因为您的convertView将在onItemClick侦听器之前使用单击.

今天的关于如何使多个listview响应不同的onItemClickListener?listview多种item的分享已经结束,谢谢您的关注,如果想了解更多关于Android Fragment中ListView的OnItemClickListener无效、Android ListView与OnItemClickListener和GestureDetector、Android ListView的OnItemClickListener详解、android – ListView setOnItemClickListener无法正常工作的相关知识,请在本站进行查询。

本文标签: