android - 如何使用 Tag 代替 R.id。在自定义 ArrayAdapter 的构造函数中?

标签 android android-layout android-arrayadapter android-view android-custom-view

在我的 Android 项目中,我需要通过标签而不是 ID 来查找 Activity 中的 View 。 (如果你问我为什么不简单地使用 findViewById,这不是我的偏好,而且描述起来很复杂,但目前我不能依赖 R.id。 常量!) 到目前为止,为了在我的代码中查找 View ,我已经成功地使用了它:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.index);
    mainViewGroup = (ViewGroup)getWindow().getDecorView();
    TextView indexCaption = (TextView) mainViewGroup.findViewWithTag("index_caption");
    // Now I have my TextView and can use it without problem
}

但现在,问题是我在同一 Activity 中的自定义 ArrayAdapter:

    class IconicAdapter extends ArrayAdapter<String> {
    IconicAdapter() {
                    // How I can use Tag instead of R.layout.index_row_caption here?!!!
        super(IndexActivity.this, R.layout.index_row, R.id.index_row_caption, arrayList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = super.getView(position, convertView, parent);
                    // Some customizations...
        return (row);
    }
}
该 IconicAdapter 的

index_row.xml:

android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/content_bg" >

<TextView
    android:id="@+id/index_row_caption"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_toLeftOf="@+id/index_row_icon"
    android:layout_toRightOf="@+id/index_row_search"
    android:gravity="right"
    android:tag="index_row_caption"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<ImageView
    android:id="@+id/index_row_icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:tag="index_row_icon" />

<ImageView
    android:id="@+id/index_row_search"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:src="@drawable/index_row_search"
    android:tag="index_row_search" />

如何避免在构造函数中使用 R.id.index_row_caption 并将其替换为与其标签相关的内容?

编辑:最后,我完成了这段代码,并且效果很好:(积分和赏金属于帮助我完成此任务的 pawelzieba)

    class IconicAdapter extends ArrayAdapter<String> {
    IconicAdapter() {
        super(IndexActivity.this, R.layout.index_row, 0, arrayList);
    }

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

        View view;
        if (convertView == null) {
            LayoutInflater mInflater = IndexActivity.this.getLayoutInflater();
            view = mInflater.inflate(R.layout.index_row, parent, false);
        } else {
            view = convertView;
        }

        //find views
        TextView text = (TextView) view.findViewWithTag("index_row_caption");

        //fill views with data
        text.setText(arrayList.get(position));          

        return view;
    }
}

最佳答案

扩展ArrayAdapter并覆盖getView()方法。

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

    if (convertView == null) {
        view = mInflater.inflate(R.layout.index_row, parent, false);
    } else {
        view = convertView;
    }

    //find views
    TextView text = (TextView) view.findViewWithTag("index_row_caption");

    //fill views with data
    //example:
    T item = getItem(position);
    text.setText(item.toString());


    return view;
}

然后传递给构造函数的行资源 ID 未被使用。

为了获得更好的性能,请使用 View 持有者模式在创建行 View 时仅调用一次 findViewWithTag: http://www.vogella.com/articles/AndroidListView/article.html#adapterperformance_hoder

关于android - 如何使用 Tag 代替 R.id。在自定义 ArrayAdapter 的构造函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12245260/

相关文章:

javascript - 如何通过单击文本打开网页

java - 更改RelativeLayout以添加ListView

java - Android 动态标题栏

android - 将所选项目的数据传递给另一个 Activity - android

android - 如何使用 react-native-firebase 从 Firebase 动态链接接收查询参数?

java - 如何为两个Android应用程序制作一个后端和数据库

java - 如何将git项目制作为Android项目?

Android自定义后台xml发送属性

android - 如何将数据从对象输入到 SimpleAdapter

android - 更改 ArrayAdapter 中的元素