android - listview按位置获取项目视图

时间:2014-07-17 19:05:20

标签: android android-listview android-view android-adapter

我有自定义适配器(基本适配器)的listview。我想按位置从listview获取视图。我试过了mListView.getChildAt(position),但它没有用。如何按位置获取项目视图?

6 个答案:

答案 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()函数,然后通过调用

重绘ListView
notifyDataSetChanged();
编辑:虽然有办法做到这一点,但如果你需要做到这一点,那么就有机会做错事。虽然我可以考虑很少的边缘情况,但通常使用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();
            }



        }
    });