更改 Android 中选定列表项的布局 [英] Change layout of selected list item in Android
问题描述
我需要创建一个 ListView
并只为所选行显示更详细的布局,以便向客户显示更多信息.我尝试的内容如下:
I need to create a ListView
and show more detailed layout only for the selected row in order to show more information to the costumer. What I tried is 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());
}
});
这是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;
}
}
在这个问题中,有人问过类似的问题,但对我没有帮助.我猜我需要对 Adapter 做点什么,但我卡在这里了.任何想法将不胜感激.
In this question, similar question was asked but it didn't help me. I am guessing I need to do something with Adapter but I got stuck here. Any ideas will be appreciated.
推荐答案
您所做的甚至不是要更改 ListView 项的视图,而是在膨胀一个未知的视图.
What you are doing is not even gonna change the View of the ListView Item, you are inflating an unknown view.
解决方案:
在您的适配器中创建一个方法来设置所选项目的位置:
create a method in your adapter for setting the position of the selected item:
public void selectedItem(int position)
{
this.position = position; //position must be a global variable
}
在您的 getView
中,当位置等于点击项位置时,膨胀视图
in your getView
inflate the view when the position is equals to the click item 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;
}
在您的 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();
}
});
总是有一个 reference/object
到你的适配器,这样你就可以在点击它时刷新你的 listView.
always have a reference/object
to your adapter so you can refresh your listView upon clicking on it.
这篇关于更改 Android 中选定列表项的布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!