在这里,我们将给大家分享关于如何使多个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)
- Android Fragment中ListView的OnItemClickListener无效
- Android ListView与OnItemClickListener和GestureDetector
- Android ListView的OnItemClickListener详解
- android – ListView setOnItemClickListener无法正常工作
如何使多个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无效
人可能会变,但代码不一样,一个地方出错说不执行就是不执行。
网上说是ListView的 OnItemClick监听失效的原因。还有网上给出的解决方案是把加载ListView数据的每一项都加上
android:focusable="false"
然后一切问题就OK 了。
因为点击的焦点被ListView列表里的其他控件给获取了,所以就出现未反应情况。
Android ListView与OnItemClickListener和GestureDetector
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检测到一切都没有了,但是在完成了逻辑之后,会打开上下文菜单,这显然不是我想要的.任何想法我做错了,还是我可以做什么?
解决方法
但是我已经找到了解决方法:在onFling回调中,处理完所有内容后,为ListView对象执行下一步:
Event cancelEvent = Event.obtain(ev2); cancelEvent.setAction(MotionEvent.ACTION_UP); listView.onTouchEvent(cancelEvent);
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无法正常工作
就像标题所说,我的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无法正常工作的相关知识,请在本站进行查询。
本文标签: