Android ListView 自定义Adapter,条件选择两个布局样式,怎么用 convertView ?

在一个消息收发的活动中,收到的消息和发出的消息都是显示在ListView中的。现在收到的和发出的消息布局背景是不同的,所以每次都在getView中重新实例化布局对象,因为... 在一个消息收发的活动中,收到的消息和发出的消息都是显示在 ListView 中的。

现在收到的和发出的消息布局背景是不同的,所以每次都在 getView 中 重新实例化布局对象,因为如果使用 convertView 的话,布局就不能固定了,如下列代码中注释的部分:
public View getView(int position, View convertView, ViewGroup parent) {
// ListView item layout
LinearLayout linearLayout = null;
Message message = getItem(position);

// using convertView
/*
// switch author type
// case 1 (receive); case 2 (send)
if (convertView == null) {
switch (message.getAuthorType()) {
case 1:
linearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.msg_list_item_1, null);
break;
case 2:
linearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.msg_list_item_2, null);
break;
}

} else {
linearLayout = (LinearLayout) convertView;
}
*/
// layout message element
TextView content = (TextView) linearLayout.findViewById(R.id.tvContent);
content.setText(message.getContent());

return linearLayout;
}
抱歉没有语法高亮,所以删除了没必要的代码。请问这种情况怎么解决?
展开
 我来答
幻想流逝
推荐于2016-10-16 · TA获得超过1743个赞
知道大有可为答主
回答量:642
采纳率:75%
帮助的人:562万
展开全部

不太清楚你的意思,说下我的思路给你参考下吧。


如果你收发消息仅仅是背景不同,完全没必要用两个布局,实例化后用setBackgroundResource就行了。


  if (convertView == null) {
      linearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.msg_list_item_1, null);
  }else {
        linearLayout = (LinearLayout) convertView;
    }
    
    switch (message.getAuthorType()) {
        case 1:
            linearLayout.setBackgroundResource(R.drawable.背景1);
            break;
        case 2:
            linearLayout.setBackgroundResource(R.drawable.背景2);
            break;
    }
    
    TextView content = (TextView) linearLayout.findViewById(R.id.tvContent);
        content.setText(message.getContent());


如果布局差异比较大,你可以试试在你的Adapter中定义全局变量linearLayout1,linearLayout2,然后构造时初始化,linearLayout1 = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.msg_list_item_1, null);

linearLayout2 = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.msg_list_item_2, null);

最后在getView方法中,不要用convertView == null判断,直接根据条件让convertView = linearLayout1或linearLayout2。不过这方法我没实际试过,不一定好用就是了。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式