Android:从自定义列表视图中单击的按钮获取列表视图项目

Posted

技术标签:

【中文标题】Android:从自定义列表视图中单击的按钮获取列表视图项目【英文标题】:Android: Get the listview item from button clicked in custom listview 【发布时间】:2012-06-24 17:53:26 【问题描述】:

我有一个带有两个按钮的自定义 ListView,当我单击任意行上的任一按钮时,我想在 Listview 上获取文本标签,现在只需用它弹出一个 toast。到目前为止,我一直在获取数组中的最后一项。

这是一个屏幕截图,可让您更好地了解我的意思

这是我的自定义 ListView 的适配器子类

static final String[] Names = 
           new String[]  "John", "Mike", "Maria", "Miguel";


class MyArrayAdapter extends ArrayAdapter<String> 
    private final Context context;      

    int which;

    public MyArrayAdapter(Context context, String[] pValues) 
        super(context, R.layout.main, pValues);
        this.context = context;
        values = pValues;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        rowView = inflater.inflate(R.layout.main, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.logo);
        Button call = (Button) rowView.findViewById(R.id.button1);
        Button chat = (Button) rowView.findViewById(R.id.button2);
        textView.setText(values[position]);


        // Change icon based on name
        s = values[position];           
        which = position;
        call.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                String name = values[which];
                Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show();
            
        );

        return rowView;
    

编辑:

String name = textView.getText().toString();
RelativeLayout ll = (RelativeLayout)v.getParent();
textView = (TextView)ll.findViewById(R.id.label);
Toast.makeText(CustomListView.this, name,
Toast.LENGTH_SHORT).show();

【问题讨论】:

尝试用textView.getText().toString() 代替values[which] 【参考方案1】:

容易做到:

    call.setOnClickListener(new OnClickListener()  
        @Override 
        public void onClick(View v)  
            RelativeLayout rl = (RelativeLayout)v.getParent();
            TextView tv = (TextView)rl.findViewById(R.id.label);
            String text = tv.getText().toString();
            Toast.makeText(CustomListView.this, text, Toast.LENGTH_SHORT).show(); 
         
    ); 

【讨论】:

我在我的 XML 中使用了相对布局。我已经这样做了,并且有一些改进,但是当我第一次单击每个按钮时,我得到了前一个 TextView 的值,之后我得到了正确的值。我还在 Logcat 中收到警告:06-22 14:28:29.279: W/Resources(14841): Converting to string: TypedValuet=0x12/d=0x0 a=3 r=0x7f050002 这不应该发生,因为上面的代码使用单击的按钮来查找父级(行),然后使用它来查找兄弟文本视图...您可以编辑您的帖子以将代码显示为现在是? 我现在已经编辑了我的帖子。我也很惊讶,因为我相信它应该会起作用。 天哪,我想我以前应该在 getparent 下方有 get 文本 这实现起来要简单得多【参考方案2】:

使用 View 的 setTag 属性........

作为

Button call = (Button) rowView.findViewById(R.id.button1);
call.setTag(position);

call.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
               int which = -1;
               Obejct obj =  v.getTag();
              if(obj instaceof Integer)
               which  = ((Integer)obj).intValue();
                    

              if(which >-1)
                String name = values[which];
                Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show();
                
            
        );

【讨论】:

哇,这成功了。你能简单解释一下你到底在做什么吗 基本上每个视图都可以使用 setTag 保留任何对象来自该特定按钮的标签.........【参考方案3】:

如果您有一个 ListActivity,并且您没有使用自己的适配器,您仍然可以获得属于被点击按钮的列表项,如下所示:

在列表行的布局文件中:

<ImageButton
        android:id="@+id/button_call"
        android:layout_
        android:layout_
        android:contentDescription="Call"
        android:onClick="callBuddy"
        android:src="@drawable/call_button_image"
        />

在您的 ListActivity 中:

public void callBuddy(View view) 

    int position = getListView().getPositionForView((View) view.getParent());
    Buddy buddyToCall = (Buddy) getListView().getItemAtPosition(position);

    Toast.makeText(MyListActivity.this, String.format("Calling your buddy %s.", buddyToCall.name), Toast.LENGTH_SHORT).show();


【讨论】:

【参考方案4】:

只需使用 getItem() 并传递位置 例如:getItem(position).getID() 这里的getID()方法是getter方法

【讨论】:

【参考方案5】:

将 onClick="click" 设置为按钮/图像/等的 xml...

在你的活动中,做:

public void click(View v) 
    final int position = getListView().getPositionForView(v);
    String text = getListView().getItemAtPosition(position).toString();
    Toast.makeText(getApplicationContext, text, Toast.LENGTH_SHORT).show();

【讨论】:

哇,这看起来如此简单。您不必定义其他任何东西吗?比如getListView()position 是什么 最终 int 位置 = getListView().getPositionForView(v);

以上是关于Android:从自定义列表视图中单击的按钮获取列表视图项目的主要内容,如果未能解决你的问题,请参考以下文章

从自定义适配器获取片段中的 UI 元素 ID

使用基本适配器解决方案从自定义列表中删除行视图

如何从自定义列表视图中获取选定项目并在 toast 消息中打印?

Flutter 如何从自定义小部件中获取价值

Android - 从自定义列表视图中删除一个项目并在长按时更新它

使用微调器从自定义列表视图中删除了错误的行