我有自定义适配器(基本适配器)的listview。我想按位置从listview获取视图。我试过了mListView.getChildAt(position)
,但它没有用。如何按位置获取项目视图?
答案 0 :(得分:245)
使用此:
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
答案 1 :(得分:13)
您只能从ListView获取可见的视图,因为ListView中的行视图是可重用的。如果您使用mListView.getChildAt(0)
,则会获得第一个可见视图。此视图与位置mListView.getFirstVisiblePosition()
的适配器中的项目相关联。
答案 2 :(得分:4)
在绘制ListView后更改外观/行视图的首选方法是更改ListView数据中的某些内容(传递到适配器中的对象数组),并确保在您的内容中考虑到这一点getView()函数,然后通过调用
重绘ListViewnotifyDataSetChanged();
编辑:虽然有办法做到这一点,但如果你需要做到这一点,那么就有机会做错事。虽然我可以考虑很少的边缘情况,但通常使用notifyDataSetChanged()
和其他内置机制是一种方法。
编辑2:人们常犯的一个常见错误就是试图用自己的方式来回应用户点击/选择ListView中的一行,如本文的评论之一。有一种现有的方法可以做到这一点。以下是:
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
/* Parameters
parent: The AdapterView where the click happened.
view: The view within the AdapterView that was clicked (this will be a view provided by the adapter)
position: The position of the view in the adapter.
id: The row id of the item that was clicked. */
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//your code here
}
});
ListView有很多内置功能,没有必要为简单的情况重新发明轮子。由于ListView扩展AdapterView,您可以设置相同的监听器,例如上面示例中的OnItemClickListener。
答案 3 :(得分:1)
workignHoursListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,View view, int position, long id) {
viewtype yourview=yourListViewId.getChildAt(position).findViewById(R.id.viewid);
}
});
答案 4 :(得分:0)
这是VVB发布的功能的Kotlin版本。 我在ListView适配器中使用了它,以实现getView()中的“当在当前行的最后一个EditText上按下Enter键时,首先转到下一行EditText。”
在ListViewAdapter类中,有趣的getView(),如下添加lastEditText.setOnKeyListner:
lastEditText.setOnKeyListener { v, keyCode, event ->
var setOnKeyListener = false
if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
try {
val nextRow = getViewByPosition(position + 1, parent as ListView) as LinearLayout
val nextET = nextRow.findViewById(R.id.firstEditText) as EditText
nextET.isFocusableInTouchMode = true
nextET.requestFocus()
} catch (e: Exception) {
// do nothing
}
setOnKeyListener = true
}
setOnKeyListener
}
在有趣的getView()之后添加有趣的getViewByPosition(),如下所示:
private fun getViewByPosition(pos: Int, listView: ListView): View? {
val firstListItemPosition: Int = listView.firstVisiblePosition
val lastListItemPosition: Int = firstListItemPosition + listView.childCount - 1
return if (pos < firstListItemPosition || pos > lastListItemPosition) {
listView.adapter.getView(pos, null, listView)
} else {
val childIndex = pos + listView.headerViewsCount - firstListItemPosition
listView.getChildAt(childIndex)
}
}
答案 5 :(得分:-2)
Listview lv = (ListView) findViewById(R.id.previewlist);
final BaseAdapter adapter = new PreviewAdapter(this, name, age);
confirm.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
View view = null;
String value;
for (int i = 0; i < adapter.getCount(); i++) {
view = adapter.getView(i, view, lv);
Textview et = (TextView) view.findViewById(R.id.passfare);
value=et.getText().toString();
Toast.makeText(getApplicationContext(), value,
Toast.LENGTH_SHORT).show();
}
}
});