ListView与隐藏字段的自定义布局?

时间:2015-06-11 12:02:04

标签: android android-layout

目前我有一个绑定到适配器的listview(在DialogFragment中):

adapter = new SimpleCursorAdapter(getActivity(),
                                  android.R.layout.simple_list_item_2,
                                  null,
                                  new String[] { "_id", "name" },
                                  new int[] { android.R.id.text1, android.R.id.text2 },
                                  0);
listView.setAdapter(adapter);

但是,我只想显示名称,但仍然保留id,因为当用户选择一个项目时,id会返回到调用活动。

我是否需要使用隐藏的TextView进行自定义布局,还是有更好的方法从当前项中获取ID?

4 个答案:

答案 0 :(得分:1)

好的你可以使用自定义适配器。 但如果你不想这样做。 您可以通过覆盖 bindView ()来更改代码的默认行为。

            adapter = new SimpleCursorAdapter(NavDrawer.this,
                    android.R.layout.simple_list_item_1,
                    null,
                    new String[] { "_id", "name" },
                    new int[] { android.R.id.text1},
                    0){
                @Override
                public void bindView(View view, Context context, Cursor cursor) {
                    super.bindView(view, context, cursor);
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    String _id = cursor.getString(cursor.getColumnIndex("_id"));
                    TextView tv = (TextView) view.findViewById(android.R.id.text1);
                    tv.setText(name);
                    //here you can store your id on textview tag
                    tv.setTag(_id);
                }
            }; 

获取ID

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        TextView tv = (TextView) view.findViewById(android.R.id.text1);
        String _id = tv.getTag().toString();        
     }
});

答案 1 :(得分:0)

您可以将此布局用于SimpleCursorAdapter

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/txt_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"/>

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

</RelativeLayout>

将其命名为custom_layout,然后按如下方式更改SimpleCursorAdapter

    adapter = new SimpleCursorAdapter(getActivity(),
                                  R.layout.custom_layout,
                                  null,
                                  new String[] { "_id", "name" },
                                  new int[] { R.id.txt_id, R.id.txt_name},
                                  0);
listView.setAdapter(adapter);

txt_id TextView将被隐藏,只有txt_name对用户可见。

答案 2 :(得分:0)

而是再次创建一个轮子,你可以使用CursorAdapter。 下面的示例如何在片段中使用它(我使用getActivity()获取上下文)。

//test: generating elements
ArrayList<String> values = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    values.add("word" + values.size());
}

//test: adding elements to cursor
MatrixCursor mc = new MatrixCursor(new String[]{"_id", "name"});
for (int i = 0; i < values.size(); i++) {
    mc.addRow(new Object[]{i, values.get(i)});
}


listView = (ListView) inflate.findViewById(R.id.listView);
adapter = new CursorAdapter(getActivity(), mc, false) {

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ((TextView) view.findViewById(android.R.id.text1)).setText(cursor.getString(cursor.getColumnIndex("name")));

        //just example how to get _id
        Log.d("xxx", "it's id is " + cursor.getString(cursor.getColumnIndex("_id")));
    }

};

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.d("xxx", "clicked id:" + id);
    }
});

listView.setAdapter(adapter);

答案 3 :(得分:0)

简单地说,只是不要为你想要展示的项目设置文字..希望这有效..

感谢