【问题标题】:Change layout of selected list item in Android在Android中更改所选列表项的布局
【发布时间】:2014-08-17 08:17:07
【问题描述】:

我需要创建一个ListView 并仅为所选行显示更详细的布局,以便向客户显示更多信息。我尝试的如下:

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

In this question,有人问过类似的问题,但对我没有帮助。我猜我需要对适配器做一些事情,但我被困在这里。任何想法将不胜感激。

【问题讨论】:

  • 为每个列表视图项设置一个自定义的 StateListDrawable 并覆盖其 onStateChange 方法

标签: android listview android-listview adapter


【解决方案1】:

你所做的甚至不会改变 ListView 项目的视图,你正在膨胀一个未知的视图。

解决方案:

在您的适配器中创建一个方法来设置所选项目的位置:

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

在您的getView 中,当位置等于点击项位置时,为视图充气

@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。

【讨论】:

  • 感谢您的回答。从if (convertView == null) 更改为if (convertView == null || || convertView.getTag() == null) 是我认为的正确方式,有时convertView.getTag()null
  • 太棒了!谢谢。需要弄清楚当再次单击新布局 (listitem_news_selected) 时如何返回旧布局 (listitem_news)。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2017-01-29
相关资源
最近更新 更多