0

我目前正在开发 android 项目,我正在使用自定义列表视图,其中每个项目都有 TextViews。我通过使用设置可显示文本myTextView.setText("my text"),然后使用设置 TextView 标记myTextView.setTag("my tag")

一旦它在列表视图中,我希望允许用户单击列表视图中的项目并检索 textview 文本以及标签。

我试过TextView textView = (TextView)getListAdapter().getItem(position); 了,``TextView textView = (TextView)getListView().getItem(position); 但它一直说它不能从String到TextView。

如何从文本视图中获取标签和文本。

感谢您的任何帮助,您可以提供。

更新 1 根据要求,这是我正在使用的 ListActivity,下面是项目单击事件的代码

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    //get selected items
    //String selectedValue = (String) getListAdapter().getItem(position);
    //TextView textView = (TextView)appArrayAdapter.getItem(position);
    TextView textView = (TextView)getListView().getChildAt(position);
    String selectedValue = textView.getText().toString();
    String selectedPackage = textView.getTag().toString();
    Intent intent = new Intent();
    intent.putExtra("appName", selectedValue);
    intent.putExtra("packageName", selectedPackage );
    setResult(0, intent);
    finish();
}

下面的代码是设置列表适配器的代码

final ArrayList<ResolveInfo> list = (ArrayList<ResolveInfo>)pm.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED);

        ArrayList<String> arrayList = new ArrayList<String>();
        imageList = new ArrayList<Drawable>();
        packageName = new ArrayList<String>();
        for(int i = 0; i != list.size(); i++)
        {
            String text = list.get(i).activityInfo.applicationInfo.loadLabel(pm).toString();
            String appPackage = list.get(i).activityInfo.packageName;
            arrayList.add(text);
            Drawable imageId = list.get(i).activityInfo.applicationInfo.loadIcon(pm);
            packageName.add(appPackage);
            imageList.add(imageId);
        }

        appArrayAdapter = new AppArrayAdapter(this, arrayList);
        //setListAdapter(new AppArrayAdapter(this, arrayList));
        setListAdapter(appArrayAdapter);

    }

下面的代码是 appArrayExtender 类

public class AppArrayAdapter extends ArrayAdapter<String>
    {
        private final Context context;
        private final ArrayList<String> arrayList;
        //private final ArrayList<Drawable> imageList;

        public AppArrayAdapter(Context context, ArrayList<String> arrayList/*, ArrayList<Drawable> imageList*/)
        {
            super(context, R.layout.select_apps, arrayList);
            this.context = context;
            this.arrayList = arrayList;
            //this.imageList = imageList;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.select_apps, parent, false);
            TextView textView = (TextView)rowView.findViewById(R.id.label);
            ImageView imageView = (ImageView)rowView.findViewById(R.id.logo);

            textView.setText(arrayList.get(position));
            textView.setTag(packageName.get(position));
            imageView.setImageDrawable(imageList.get(position));
            //imageView.setImageResource(R.drawable.icon);
            return rowView;
        }
    }

下面是布局的 XML

<?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="wrap_content"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/logo"
        android:layout_width="50px"
        android:layout_height="50px"
        android:layout_marginLeft="5px"
        android:layout_marginRight="20px"
        android:layout_marginTop="5px" >
    </ImageView>

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label" >
    </TextView>


</LinearLayout>
4

2 回答 2

2

如果您想要 TextView 中的文本请使用传递到的信息,onClick而不是所有额外的代码。框架传入被点击的视图(View v 参数)。如果是单个TextView,你可以这样做v.getText().toString(),如果是更复杂的布局,你可以使用v.findViewById(R.id.TextView1)来获取正确的TextView并getText().toString()在它上面使用:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 

    TextView textView = (TextView) v.findViewById(R.id.yourRowLayoutWidget);  // get the widget contained in the layout
    String selectedValue = textView.getText().toString(); // get the value of the widget into a string
    // do what you will with the string
} 
于 2012-06-18T02:46:42.827 回答
0

当滚动列表视图时,刚刚消失的视图项目将作为参数 convertView 传递给适配器方法的 getView,因此您在 7 项上设置标记 fe,然后将其转换为第 1 个,因为第 7 个不再是 wisivle 并且第一项将有错误的标签;

我建议你扩展 BaseAdapter 并使用你需要的所有数据存储一些对象。

它看起来像这样

public class DialogsAdapter extends BaseAdapter {

    private final LayoutInflater mInflater;

    private List<YourObjectToStoreData> mData ;

    public DialogsAdapter(Context context, List<YourObjectToStoreData> data
    ) {
        this.mInflater = LayoutInflater.from(context);

        mData = data;
    }
    ...

也看看Holder Pattern它可能有用

于 2012-06-17T23:52:43.930 回答