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;
}
抱歉没有语法高亮,所以删除了没必要的代码。请问这种情况怎么解决? 展开
现在收到的和发出的消息布局背景是不同的,所以每次都在 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;
}
抱歉没有语法高亮,所以删除了没必要的代码。请问这种情况怎么解决? 展开
展开全部
不太清楚你的意思,说下我的思路给你参考下吧。
如果你收发消息仅仅是背景不同,完全没必要用两个布局,实例化后用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。不过这方法我没实际试过,不一定好用就是了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询