我想要了解这个问题。 我是这个ListView的新手。我已设法从数据库中输入数据,并将列表项的id设置为DB记录的id。
使用android.R.layout.simple_list_item_1作为布局时一切正常,而将Text.R.id.text1用于TextView所在的TextView。 我甚至设置了setOnItemClickListener并获得了Toast whit正确数据(项目位置和我设置的_id)。
比我想使用TableRow或TableLayout作为列表项的自定义布局。 这有效,但我不知道如何引用TableRow中的视图(即TableRow本身)?
setOnItemClickListener停止工作,我不能在行上使用setOnclickListener。
如果我想获得ListView项目的POSITION和ID,或者我应该使用更聪明的东西,是否有可能以某种方式使用这种技术?
这是我的代码:
public class ListView1 extends ListActivity {
private DBAdapter db;
private Cursor getMatchigItems;
private OnItemClickListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
db = new DBAdapter(this);
db.open();
getMatchigItems = db.getMatchingItems(4, 1);
startManagingCursor(getMatchigItems);
// SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
// android.R.layout.simple_list_item_1,
// getMatchigItems,
// new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_ROWID},
// new int[]{android.R.id.text1});
// setListAdapter(adapter);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.table_row,
getMatchigItems,
new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_ROWID},
new int[]{R.id.textViewItems1});
setListAdapter(adapter);
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(listener);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), "id: " + String.valueOf(id) + "\npos: " + String.valueOf(position), Toast.LENGTH_SHORT).show();
};
});
}
}
这是我想要使用的TableRow布局:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableRowLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableRow
android:id="@+id/tableRowLayoutRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rowcat"
android:layout_marginTop="2dp"
android:minHeight="40dp" android:gravity="center_vertical">
<View android:id="@+id/imagePlaceholderBlank1Items"
android:layout_width="40dp"
android:minHeight="40dp" android:layout_height="fill_parent" android:background="@drawable/editicon"/>
<TextView android:id="@+id/textViewItems1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tule bo ime artikla" style="@style/whiteText" android:layout_marginLeft="10dp" android:ellipsize="marquee" android:lines="1" android:focusable="true" android:width="220dp" android:scrollHorizontally="true" android:marqueeRepeatLimit="marquee_forever" android:focusableInTouchMode="true"/>
<TextView android:id="@+id/imagePlaceholderButton1Items"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:minHeight="40dp"
android:gravity="center" android:textColor="#FFF" android:background="@drawable/buttonoff" android:tag="off"/>
</TableRow>
</TableLayout>
提前感谢任何建议!
答案 0 :(得分:0)
您似乎无法以正常方式在ListView中引用TableLayout,因此我必须使用LinearLayout来使onItemClick正常工作。 它甚至为您提供了一些很好的参数:父,视图,位置和我已经分配给Item的ID以及数组中最后一个Sting(一个额外的String)。
注意3个TextViews的“to”参数,我在“from”参数中使用了4个字符串。最后一个是额外的,它必须是数据库表中的“ _id ”键。它被分配给项目ID。效果很好。
new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_INTIDCAT, db.KEYITEMS_ROWID, db.KEYITEMS_ROWID},
new int[]{R.id.text1,R.id.text2,R.id.text3});
这是整个活动:
public class ListView2 extends ListActivity {
private DBAdapter db;
private Cursor getMatchingItems;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.testview);
db = new DBAdapter(this);
db.open();
getMatchingItems = db.getMatchingItems(3, 1);
startManagingCursor(getMatchingItems);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.testlistrow,
getMatchingItems,
new String[]{db.KEYITEMS_TXTITEMNAME, db.KEYITEMS_INTIDCAT, db.KEYITEMS_ROWID, db.KEYITEMS_ROWID},
new int[]{R.id.text1,R.id.text2,R.id.text3});
setListAdapter(adapter);
lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long myId) {
final ListView lvTest = getListView();
final LinearLayout llTest = (LinearLayout) lvTest.getChildAt(position);
TextView tv1 = (TextView) llTest.findViewById(R.id.text1);
tv1.setText("CHANGE");
tv1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String s = llTest.getParent().toString();
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
}
});
String s = String.valueOf(lvTest.getChildAt(position));
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
}
});
}
}
这是我从this lovely lady借来的XML。 她为SimpleAdapter解释得很好。这只是我对SimpleCursorAdapter的推文。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000fff"
android:layout_weight="2"
android:drawSelectorOnTop="false">
</ListView>
<TextView android:id="@id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFff00"
android:text="No data"
/>
</LinearLayout>
我希望有人能找到这个有用的,或者ASAP告诉我,如果他们知道更好的方法,那就不是这样做的方法。 感谢