目前我有一个绑定到适配器的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?
答案 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)
简单地说,只是不要为你想要展示的项目设置文字..希望这有效..
感谢