android - listview get item view by position

AndroidAndroid ListviewAndroid ViewAndroid Adapter

Android Problem Overview


I have listview with custom adapter (base adapter). I want to get view from listview by position. I tried mListView.getChildAt(position) , but it is not working. How can i get item view by position?

Android Solutions


Solution 1 - Android

Use this :

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);
    }
}

Solution 2 - Android

You can get only visible View from ListView because row views in ListView are reuseable. If you use mListView.getChildAt(0) you get first visible view. This view is associated with item from adapter at position mListView.getFirstVisiblePosition().

Solution 3 - Android

Preferred way to change the appearance/whatever of row views once the ListView is drawn is to change something in the data ListView draws from (the array of objects that is passed into your Adapter) and make sure to account for that in your getView() function, then redraw the ListView by calling

notifyDataSetChanged();

EDIT: while there is a way to do this, if you need to do this chances are doing something wrong. While are few edge cases I can think about, generally using notifyDataSetChanged() and other built in mechanisms is a way to go.

EDIT 2: One of the common mistakes people make is trying to come up with their own way to respond to user clicking/selecting a row in the ListView, as in one of the comments to this post. There is an existing way to do this. Here's how:

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 has a lot of build-in functionality and there is no need to reinvent the wheel for simpler cases. Since ListView extends AdapterView, you can set the same Listeners, such as OnItemClickListener as in the example above.

Solution 4 - Android

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);
    }
});

Solution 5 - Android

This is the Kotlin version of the function posted by VVB. I used it in the ListView Adapter to implement the "go to next row first EditText when Enter key is pressed on the last EditText of current row" feature in the getView().

In the ListViewAdapter class, fun getView(), add lastEditText.setOnKeyListner as below:

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
}

add the fun getViewByPosition() after fun getView() as below:

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)
	}
}

Solution 6 - Android

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();
			}

	

		}
	});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionalashowView Question on Stackoverflow
Solution 1 - AndroidVVBView Answer on Stackoverflow
Solution 2 - AndroidMatt TwigView Answer on Stackoverflow
Solution 3 - AndroidC0D3LIC1OU5View Answer on Stackoverflow
Solution 4 - AndroidMohamed AyedView Answer on Stackoverflow
Solution 5 - AndroidDavid ChaiView Answer on Stackoverflow
Solution 6 - AndroidarjunView Answer on Stackoverflow