Android 如何通过单击列表项中的按钮来获取列表项的位置?

Android 如何通过单击列表项中的按钮来获取列表项的位置?,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,事实上我已经读过一些关于这个的问题 这是我使用的代码 auto = (ListView)findViewById(R.id.auto); String[] projection = new String[] {Browser.BookmarkColumns._ID,Browser.BookmarkColumns.TITLE,Browser.BookmarkColumns.URL}; String[] displayFields = new String[] {Browser.Bookm

事实上我已经读过一些关于这个的问题

这是我使用的代码

auto = (ListView)findViewById(R.id.auto);
String[] projection = new String[] {Browser.BookmarkColumns._ID,Browser.BookmarkColumns.TITLE,Browser.BookmarkColumns.URL};

    String[] displayFields = new String[] {Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.URL};

    int[] displayViews = new int[] { R.id.text1,R.id.text2 };

    Cursor cur = managedQuery(android.provider.Browser.BOOKMARKS_URI,projection, null, null, null);

    //auto.setAdapter(new SimpleCursorAdapter(this, R.layout.mylist, cur,displayFields, displayViews));

    myAdapter apt = new myAdapter(this, R.layout.mylist, cur,displayFields, displayViews);
    auto.setAdapter(apt);
和类myAdapter

class myAdapter extends SimpleCursorAdapter{

    private Cursor c;
    private Context context;


    public myAdapter(Context context, int layout, Cursor c, String[] from,
            int[] to) {
        super(context, layout, c, from, to);
        // TODO Auto-generated constructor stub
        this.c = c;
        this.context = context;
        AutoList att = new AutoList();
        mListView = att.auto;

    }

    @Override
    public View getView(int pos, View inView, ViewGroup parent) {
           View vix = inView;

           if (vix == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vix = inflater.inflate(R.layout.mylist, null);
           }
           this.c.moveToPosition(pos);      

           String title = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE));

           String cont = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.URL));

               TextView text1 = (TextView) vix.findViewById(R.id.text1);
               text1.setText(title);
               TextView text2 = (TextView) vix.findViewById(R.id.text2);
               text2.setText(cont);
               Button butt = (Button) vix.findViewById(R.id.button);
               butt.setOnClickListener(mButt);
               return vix;
    }

    private OnClickListener mButt = new OnClickListener() {
        @Override
        public void onClick(View v) {
        final int position = mListView.getPositionForView((View) v.getParent());
            Log.v("BUTT", "Title clicked, row "+position);
        }
    };
但是,当我单击该按钮时,仍然会出现以下错误:

04-10 22:30:55.152: ERROR/AndroidRuntime(695): FATAL EXCEPTION: main
04-10 22:30:55.152: ERROR/AndroidRuntime(695): java.lang.NullPointerException
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at             com.auto2.AutoList$myAdapter$1.onClick(AutoList.java:113)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at   android.view.View.performClick(View.java:2408)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at   android.view.View$PerformClick.run(View.java:8816)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at android.os.Handler.handleCallback(Handler.java:587)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at   android.os.Handler.dispatchMessage(Handler.java:92)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at android.os.Looper.loop(Looper.java:123)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at java.lang.reflect.Method.invokeNative(Native Method)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at java.lang.reflect.Method.invoke(Method.java:521)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-10 22:30:55.152: ERROR/AndroidRuntime(695):     at   dalvik.system.NativeStart.main(Native Method)
就这样! 我希望这不会那么难弄明白

谢谢

onClick()
中,
mListView
似乎为空。有可能

auto = (ListView)findViewById(R.id.auto);

返回null,因为在当前布局中找不到
R.id.auto
的视图。我会在该行后面放置一个调试器断点,然后查看。

带有可单击按钮的列表视图

好吧,这是到目前为止解决我问题的大致方法

item.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:orientation="horizontal"
            android:layout_height="wrap_content">
<TextView android:id="@+id/showTv"
      android:layout_alignParentLeft="true"
      android:gravity="center_vertical"
      android:textSize="24dip"
      android:layout_height="wrap_content"
      android:layout_width="wrap_content" /> 
 <RelativeLayout android:id="@+id/jjjj"
                 android:layout_alignParentRight="true"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content">        
      <Button android:id="@+id/gointoBt"
               android:focusable="false"
               android:layout_alignParentRight="true"
               android:text="abc"
               android:layout_height="wrap_content"
               android:layout_width="wrap_content"/> 
      <Button android:id="@+id/chooseBt"
              android:layout_toLeftOf="@id/gointoBt"
              android:layout_marginRight="10dip"
              android:text="text"
              android:focusable="false"
              android:layout_height="wrap_content"
              android:layout_width="wrap_content"/>
  </RelativeLayout> 

MySimpleAdapter:

import ........;

public class MySimpleAdapter extends SimpleAdapter {

private final Context context;
private List<Map<String, Object>> data;
private int resource;
private String[] from;
private int[] to;

public MySimpleAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from,
int[] to) {
   super(context, data, resource, from, to);
   this.context=context;
   this.data=(List<Map<String, Object>>) data;
   this.resource=resource;
   this.from=from;
   this.to=to;
}

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

   LayoutInflater inflater = ((Activity)context).getLayoutInflater();
   View rowView = inflater.inflate(resource, null, true); 
   Map<String, Object> medMap=data.get(position);
   final TextView[] showTv=new TextView[from.length]; 

   for (int i = 0; i < from.length; i++) { 
    showTv[i]=(TextView)rowView.findViewById(to[i]);
    showTv[i].setText(""+medMap.get(from[i]));
   }
Button btn=(Button)rowView.findViewById(R.id.gointoBt);
   Button.OnClickListener mOkOnClickListener = new Button.OnClickListener()
      {
         public void onClick(View v) {
         Log.v("ttttttt", ""+showTv[0].getText());
         Toast.makeText(context,""+showTv[0].getText(), Toast.LENGTH_LONG).show();
         }
     };
 btn.setOnClickListener(mOkOnClickListener); 

     Button btn2=(Button)rowView.findViewById(R.id.chooseBt);
   Button.OnClickListener mOkOnClickListener2 = new Button.OnClickListener()
      {
          public void onClick(View v) {
          Log.v("hhhhhhh", ""+showTv[0].getText());
          Toast.makeText(context,"abc"+showTv[0].getText(), Toast.LENGTH_LONG).show();
          }
      };
   btn2.setOnClickListener(mOkOnClickListener2);     
   return rowView; 
}
}
导入。。。。。。。。;
公共类mysimpledapter扩展了simpledapter{
私人最终语境;
私人名单数据;
私有int资源;
来自的私有字符串[];
私人int[]至;
public mysimpledapter(上下文,列表>数据,int资源,字符串[]from,
int[]至){
超级(上下文、数据、资源、从、到);
this.context=context;
this.data=(列表)数据;
这个。资源=资源;
this.from=from;
这个。to=to;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
视图行视图=充气机。充气(资源,空,真);
Map medMap=data.get(位置);
最终文本视图[]showTv=新文本视图[from.length];
对于(int i=0;i
活动:

import .......;

public class   ActivityMain extends Activity {

ListView listview;
List<Map<String,Object>> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setTitle("My work");
   prepareData(); 
   listview =new ListView(this);
   MySimpleAdapter adapter=new MySimpleAdapter(this,data,R.layout.item,new String[]      {"uu"},new int[]{R.id.showTv});

   listview.setAdapter(adapter);                            
     setContentView(listview);

}
private void prepareData(){
   data=new ArrayList<Map<String,Object>>();
   Map<String,Object> item;
   item=new HashMap<String,Object>();
   item.put("uu", "hello");
   data.add(item);
   item=new HashMap<String,Object>();
   item.put("uu", "myyou");
   data.add(item);
   item=new HashMap<String,Object>();
   item.put("uu", "piero");
   data.add(item);
}

}
导入。。。。。。。;
公共类活动Main扩展活动{
列表视图列表视图;
列出数据;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
片名(“我的作品”);
prepareData();
listview=新的listview(此);
mysimpledapter adapter=new mysimpledapter(this,data,R.layout.item,新字符串[]{“uu”},新int[]{R.id.showTv});
setAdapter(适配器);
setContentView(listview);
}
私有无效准备数据(){
数据=新的ArrayList();
地图项目;
item=newhashmap();
物品。放置(“uu”,“你好”);
数据。添加(项目);
item=newhashmap();
项目.投入(“uu”、“myyou”);
数据。添加(项目);
item=newhashmap();
项目。出售(“uu”、“piero”);
数据。添加(项目);
}
}
感谢这位好心人提供了这本很棒但最强大的教程。。。。
这里的任何人都不能给noobs…实际上,我使用了相同的方法-只是添加了铸造父布局,我得到了位置,没有任何例外

public void deleteButtonClick(View v) {
        //TODO Remove favorite - DB + file system
        Toast.makeText(this, "Deleting bookmark", Toast.LENGTH_SHORT).show();
        final int position = getListView().getPositionForView((LinearLayout)v.getParent());
        if (position >= 0) {
            Favorite o = (Favorite) this.getListAdapter().getItem(position);
        }
}
我的listview行布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.bbox.application"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <com.markupartist.android.widget.ActionBar
        android:id="@+id/actionbar" app:title="@string/ac_title" style="@style/ActionBar" />
    <ListView android:id="@+id/android:list" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:layout_weight="5"
        android:background="@drawable/categrory_bckgr" />
    <TextView android:id="@+id/android:empty"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:text="@string/main_no_items" />

</LinearLayout>


我希望这会有所帮助。

一个更简单的解决方案可能是,当您的活动实现OnClickListener,并将(强制转换的)上下文设置为OnClickListener,以在适配器中显示您想要的任何视图时。要获得更健壮的代码,可以使用instanceof进行检查

public class MyActivity implements OnClickListener {

    // ...

}

public class MyAdapter extends CursorAdapter {

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        final TextView tv = (View) view.findViewById(R.id.text1);

        setOnClickListener((OnClickListener)context);

        tv.setTag(cursor.getPosition());

    }

}

为方便起见,您可以将适配器中的项目位置设置为视图的标记。这样,您可以轻松地在适配器中查找整个项目。

我认为还有一种更好的方法。您可以使用按钮添加一个标记作为位置 (button.setTag())方法,并且每当用户单击按钮时,只需获取此按钮的标记。这会更容易

谢谢和问候
拉胡尔非常简单。在适配器类
getView
方法中,将int-position更改为最终int-position

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

LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(yourcustomizeditemview.xml, parent,
                false);
Button btn= (Button) row.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {

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

                Toast.makeText(context, " "+position, Toast.LENGTH_SHORT).show();

            }
        });
return row;
    }
现在在
按钮上
单击
Toast
显示出现
按钮
的项目位置。

是否执行此操作

btnNxt = (Button) findViewById(R.id.btnNext);
 btnNxt.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View arg0) {
  //Here I need to get that position
});
在getView方法内部?如果是这样,那就很容易了

 btnNxt = (Button) findViewById(R.id.btnNext);
 btnNxt.setTag(position);
 btnNxt.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View arg0) {
  int position=(Integer)arg0.getTag();
});

由此:

我们可以通过在适配器的getView方法中实现onClickListener来获得位置

适配器:

public class DetailsListAdapter extends BaseAdapter {
Context context;
ArrayList<Profile> data;

public DetailsListAdapter(Context context, ArrayList<Profile> data) {
    this.context = context;
    this.data = data;
}

@Override
public int getCount() {
    return data.size();
}

@Override
public Object getItem(int position) {
    return data.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.list_item_logs_details, null);
        viewHolder = new ViewHolder();
        viewHolder.btn = (Button) convertView.findViewById(R.id.log_details_1_a);
        viewHolder.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    Log.d("statusPosition","position "+position);
            }
        });
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    return convertView;
}

public static class ViewHolder {
    TextView tv2, tv3, tv3a, tv4, tv4a;
    Button btn;
}
}
public类DetailsListAdapter扩展了BaseAdapter{
语境;
阵列列表数据;
public DetailsListAdapter(上下文、ArrayList数据){
this.context=上下文;
这个数据=数据;
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回数据。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null){
convertView=LayoutInflater.from(context).充气(R.layout.list\u item\u logs\u details,null);
viewHolder=新的viewHolder();
viewHolder.btn=(按钮)convertView.findViewById(R.id.log\u details\u 1\u a);
viewHolder.btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
日志d(“状态位置”、“位置”+位置);
}
});
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
返回视图;
}
公共静态类ViewHo