安卓,自定义ListAdapter获取TextView文本

7

我编写了一个自己的适配器,并通过ListView将其添加到我的ListActivity中。编写自己的适配器的原因是,我必须对列表条目进行一些布局更改。在列表的每个条目中,我都有3个TextView。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<TextView
    android:id="@+id/myNr"
    android:layout_width="40dip"
    android:layout_height="fill_parent"
    android:layout_marginRight="15dip"
    android:text="id" 
    android:textSize="25dip"
    android:background="#333333"
    android:gravity="center_horizontal"/>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/editor"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="Editor: " />
    <TextView
        android:id="@+id/date"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="Date: " />
</LinearLayout>

接下来我做的事情是实现一个“onListItemClick”方法。然后我用以下代码实现了一个“onListItemLongClick”监听器:

在Activity的onCreate中,我添加了以下内容:

 registerForContextMenu(getListView());

然后我添加了以下方法:

Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo){
         AdapterView.AdapterContextMenuInfo info;
         info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            long id = getListAdapter().getItemId(info.position);
        }

这里的"id"是列表中该项的索引。我现在想要获取id为"myNr"的TextView的文本内容。有没有什么方法可以获取到这个文本内容呢?

12个回答

18

view 是列表项,因此您可以执行

String s =(String) ((TextView) view.findViewById(R.id.myNr)).getText();

9

如果您扩展了BaseAdapter,只需参考文本视图即可。

Listener = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

TextView tx =(TextView)view.findViewById(R.id.text);
            String s = tx.getText().toString();
            Log.d(TAG, "string : "+s);

5

我找到了另一种设置ItemLongClickListener的方法。因此,我也找到了一种获取我显示的文本的方法。

ListView lv = getListView();
lv.setOnItemLongClickListener(new OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) {
   String[] tmp = (String[]) arg0.getItemAtPosition(row);
   //tmp[0] ist the Text of the first TextView displayed by the  clicked ListItem 
   return true;
   }});

4
我发现以上解决方案均无法奏效。作为一种替代方案,你可以:

getListView().setOnItemLongClickListener(new OnItemLongClickListener() 
{

   public boolean onItemLongClick(AdapterView<?> arg0, View v,int position, long id) 
   {

    Cursor c = (Cursor) arg0.getItemAtPosition(position);
    String tableValue = c.getString(1);

        return true;
   }
});

3
我找到的最佳解决方案是:

@Override  
        public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo) {  
        super.onCreateContextMenu(menu, view, menuInfo);  
        AdapterView.AdapterContextMenuInfo info =     (AdapterView.AdapterContextMenuInfo)menuInfo;

        ViewGroup vg = (ViewGroup) view;
        View children = vg.getChildAt(info.position);
        TextView child = (TextView) children.findViewById(R.id.text1);

        String s= child.getText().toString();
            menu.setHeaderTitle(s);  
            menu.add(0, view.getId(), 0, "Serve");  
            menu.add(0, view.getId(), 0, "View");  

        }  

2
如果您正在寻找长按项位置处的TextView,您可以使用以下代码获取它:
String s = ((TextView) view.getItemAtPosition(info.position)).getText();

0
list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
            String title = (String) ((TextView)view.findViewById(R.id.title)).getText();
                String  artist=(String)((TextView)view.findViewById(R.id.artist)).getText();

                     //System.out.println(s);
                        Toast.makeText(CustomizedListView.this,"Title = "+title+"\n"+"Artist = "+artist, Toast.LENGTH_SHORT).show();                            

        }
    });     

0
感谢您的帮助,但恐怕它仍然无法正常工作。 如果我添加您建议的行,它会在“getItemAtPosition”下划线,并显示以下内容: --The method getItemAtPosition(int) is undefined for the type View--
他建议将视图转换为AdapterView,因此它看起来如下:
String s = ((TextView) ((AdapterView<ListAdapter>) view).getItemAtPosition(info.position)).getText();

当我运行这个程序并长按项目时,我收到了一个“ClassCastException”错误。

0
在这个方法中,您将获得与您的列表项相关的项目。
@Override
public boolean onContextItemSelected(MenuItem aItem) {
  AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo();
  Object entity =  (Object) todoList.getAdapter().getItem(menuInfo.position);
  switch (aItem.getItemId()) {}
}

0

我有一个ArrayList的ArrayList作为CustomAdapter的数据源,所以我使用

menu.setHeaderTitle(Messages.get(info.position).getUserName());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接