Change the layout of a selected list item in Android

I need to create a ListView and show a more detailed layout for the selected row only, in order to show more information for the client. What I tried is given below:

 newsListView.setAdapter(new NewsListAdapter(this, news)); newsListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); //Here I tried to change layout of this row only view = inflater.inflate(R.layout.listitem_news_selected, null); TextView info = (TextView) view.findViewById(R.id.info); NewsData news = (NewsData) parent.getItemAtPosition(position); info.setText(news.getInfo()); } }); 

And here is the NewsListAdapter :

 public class NewsListAdapter extends BaseAdapter { List<NewsData> items; Activity context; /* private view holder class */ private class ViewHolder { TextView title; ImageView image; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = mInflater.inflate(R.layout.listitem_news, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.image = (ImageView) convertView.findViewById(R.id.imageView1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } NewsData news = items.get(position); holder.title.setText(news.getTitle()); new DownloadImageTask(holder.image).execute(news.getImgUrl()); return convertView; } } 

A similar question was asked in this question, but that did not help me. I suppose I need to do something with the adapter, but I'm stuck here. Any ideas would be appreciated.

+5
source share
1 answer

What you do will not even change the view of the ListView, you are inflating an unknown view.

Decision:

create a method in your adapter to set the position of the selected item:

 public void selectedItem(int position) { this.position = position; //position must be a global variable } 

in your getView inflate the view when the position is equal to the position of the click position

 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = mInflater.inflate(R.layout.listitem_news, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.image = (ImageView) convertView.findViewById(R.id.imageView1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } NewsData news = items.get(position); holder.title.setText(news.getTitle()); new DownloadImageTask(holder.image).execute(news.getImgUrl()); if(this.position == position) { view2 = mInflater.inflate(R.layout.listitem_news_selected, null); TextView info = (TextView) view2.findViewById(R.id.info); info.setText(news.getInfo()); return view2; } return convertView; } 

Using it in onItemClick

 NewsListAdapter adapter = new NewsListAdapter(this, news); newsListView.setAdapter(adapter ); newsListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { adapter.selectedItem(position); adapter.notifyDataSetChange(); } }); 

always has a reference/object for your adapter to refresh the ViewView list when you click on it.

+10
source

Source: https://habr.com/ru/post/1200518/


All Articles