`
liuguofeng
  • 浏览: 453375 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android为ListView的Item设置不同的布局

 
阅读更多
package cc.testlistview; 
import java.util.ArrayList; 
import java.util.HashMap; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
import android.app.Activity; 
/**
 * Demo描述:
 * 为ListView的Item设置不同的布局.
 * 例如在该例子中ListView的第一个Item显示一张
 * 图片,其余的Item都显示文字.
 
 * 为了达到此目的需要重写BaseAdapter中的
 * 1 getViewTypeCount()和getItemViewType(int position)方法.
 *   1.1在getViewTypeCount中指定一共有几种不同的item
 *      在此返回2即可.
 *   1.2在getItemViewType(int position)中需要依据position的不同
 *      返回不同的Type.
 * 2 在getView()方法中针对不同的Type为Item设置布局
 *   2.1得到当前位置(position)时的Type即代码:
 *       currentType= getItemViewType(position);
 *   2.2依据Type的不同为Item设置布局
 
 * 参考资料:
 *   Thank you very much
 */ 
public class MainActivity extends Activity { 
    private ListView mListView; 
    private HashMap<String, Object> mHashMap; 
    private ArrayList<HashMap<String, Object>> mArrayList; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        init(); 
    
    private void init(){ 
        mArrayList=new ArrayList<HashMap<String,Object>>(); 
        mListView=(ListView) findViewById(R.id.listview); 
        addDataForListView(); 
        mListView.setAdapter 
        (new ListViewAdapter(MainActivity.this, mArrayList, R.layout.othersitem, new String []{"content"}, new int []{R.id.textView})); 
        mListView.setOnItemClickListener(new ItemClickListenerImpl()); 
    
    private void addDataForListView(){ 
        for (int i = 0; i < 30; i++) { 
            mHashMap=new HashMap<String, Object>(); 
            mHashMap.put("content", "This is ---> "+i); 
            mArrayList.add(mHashMap); 
        
    
   
    private class ItemClickListenerImpl implements OnItemClickListener { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, int position,long arg) { 
            System.out.println("OnItemClickListener position="+position); 
   
        
    
}

 

 
ListViewAdapter如下:
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package cc.testlistview; 
import java.util.List; 
import java.util.Map; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
   
public class ListViewAdapter extends BaseAdapter { 
    private List<? extends Map<String, ?>> mArrayList; 
    private int resource; 
    private LayoutInflater mLayoutInflater; 
       
    private final int TYPE_COUNT=2
    private final int FIRST_TYPE=0
    private final int OTHERS_TYPE=1
    private int currentType; 
    public ListViewAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from,int[] to) { 
        this.mArrayList=data; 
        this.resource=resource; 
        mLayoutInflater=(LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
    
       
    @Override 
    public int getCount() { 
        if (mArrayList==null) { 
            return 0
        } else
            return (mArrayList.size()+1); 
        
           
    
       
    @Override 
    public Object getItem(int position) { 
        if (mArrayList==null) { 
            return null
        } else
            if (position>0) { 
                return mArrayList.get(position-1); 
            } else
                return mArrayList.get(position+1); 
            
        
    
       
    @Override 
    public long getItemId(int position) { 
        return position; 
    
       
    /////////////////////////////////////////////////////// 
    @Override 
    public int getViewTypeCount() { 
        return TYPE_COUNT; 
    
       
    @Override 
    public int getItemViewType(int position) { 
        if (position==0) { 
            return FIRST_TYPE; 
        } else
            return OTHERS_TYPE; 
        
    
   /////////////////////////////////////////////////////// 
       
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        View firstItemView = null
        View othersItemView=null
        //获取到当前位置所对应的Type 
        currentType= getItemViewType(position); 
        System.out.println("type="+currentType); 
        if (currentType== FIRST_TYPE) { 
            firstItemView = convertView; 
            FirstItemViewHolder firstItemViewHolder=null
            if (firstItemView==null) { 
                System.out.println("firstItemView==null "); 
                firstItemView = mLayoutInflater.inflate(R.layout.firstitem,null); 
                firstItemView.setOnClickListener(new OnClickListener() { 
                    @Override 
                    public void onClick(View view) { 
                        System.out.println("=====click first item======="); 
                    
                }); 
                firstItemViewHolder=new FirstItemViewHolder(); 
                firstItemViewHolder.imageView=(ImageView) firstItemView.findViewById(R.id.imageView); 
                firstItemView.setTag(firstItemViewHolder); 
   
            } else
                System.out.println("firstItemView!=null "); 
                System.out.println("111 getClass="+firstItemView.getTag().getClass().toString()); 
                firstItemViewHolder=(FirstItemViewHolder) firstItemView.getTag(); 
            
               
            if (firstItemViewHolder.imageView!=null) { 
                firstItemViewHolder.imageView.setImageResource(R.drawable.ic_launcher); 
            
               
            convertView=firstItemView; 
   
        } else
            othersItemView = convertView; 
            OthersViewHolder othersViewHolder=null
            if (othersItemView==null) { 
                System.out.println("othersItemView==null "); 
                othersItemView = mLayoutInflater.inflate(R.layout.othersitem,null); 
                othersViewHolder=new OthersViewHolder(); 
                othersViewHolder.textView=(TextView) othersItemView.findViewById(R.id.textView); 
                othersItemView.setTag(othersViewHolder); 
            } else
                System.out.println("othersItemView!=null "); 
                System.out.println("222 getClass="+othersItemView.getTag().getClass().toString()); 
                othersViewHolder=(OthersViewHolder) othersItemView.getTag(); 
            
               
            if (mArrayList!=null) { 
                if (othersViewHolder.textView!=null) { 
                    othersViewHolder.textView.setText((String)(mArrayList.get(position-1).get("content"))); 
                
                   
            
               
            convertView=othersItemView; 
   
        
   
        return convertView; 
    
       
     
    //第一个Item的ViewHolder 
    private class FirstItemViewHolder{ 
        ImageView imageView; 
    
       
    //除第一个Item以外其余Item的ViewHolder 
    private class OthersViewHolder{ 
        TextView textView; 
    
分享到:
评论

相关推荐

    android listView中显示不同的布局

    在许多场景下,开发者需要在ListView中显示不同的布局,比如在一个消息列表中,上行消息与下行消息的布局可能不同,这就是所谓的“聊天布局”。本篇将详细介绍如何在Android的ListView中实现这种功能,并基于提供的...

    Android 为ListView每个Item上面的按钮添加事件

    总之,为ListView的每个Item的按钮添加事件并获取TextView文本,关键在于适当地设置OnClickListener,并在点击事件中正确地定位和获取对应的TextView。记得在Adapter的getView()方法中进行这些操作,确保每个Item的...

    android 的listview 内部item的布局包含checkbox控件

    本篇文章将深入探讨如何在ListView的内部Item布局中添加并处理Checkbox控件。 首先,我们需要创建一个自定义的布局文件,用于定义ListView的每个Item。这个布局文件通常会包含一个TextView用于显示数据,以及一个...

    android ListView 网格布局

    总结起来,创建一个Android的网格布局ListView主要涉及以下几个步骤:设计网格项布局、创建自定义Adapter、在Activity中设置GridView并加载数据。通过灵活地调整布局和Adapter,你可以实现各种复杂的网格布局效果。...

    android 修改listview的不同item字体的颜色

    标题"android 修改listview的不同item字体的颜色"和描述"改代码主要是针对listview修改指定item字体颜色"都指向了这个主题。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解ListView的基本工作原理。...

    android listview item 拖动排序

    最后,确保你的item布局具有适当的触摸监听器,以便在合适的时刻响应拖放操作。这通常涉及到在item的根布局上设置`TouchListener`,并在`onTouchEvent()`中调用`listView.startDrag()`。 通过以上步骤,你就可以在...

    Android ListView 不同类型item展示

    总结,Android中的ListView通过自定义Adapter和多种视图类型,能够灵活地展示不同样式的item,提高了用户体验。理解并熟练运用这项技术对于Android开发者来说非常重要。在实际开发中,我们应结合具体需求,合理设计...

    android listview item背景色点击效果实例

    然后在ListView的item布局文件中,将这个选择器作为背景: ```xml &lt;!-- res/layout/item_layout.xml --&gt; android:layout_width="match_parent" android:layout_height="wrap_content" android:background=...

    在Android中ListView多种Item布局的实现

    在这个场景中,我们将关注如何在ListView中实现不同类型的Item布局,特别是在模拟聊天界面时,通常需要显示发送和接收两类消息,这两类消息的布局会有所不同。 首先,我们需要理解`BaseAdapter`,它是Android提供的...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    接下来,我们需要为这两个ListView分别创建Adapter,并在代码中设置它们。对于父ListView的Adapter,你需要提供一个包含子ListView数据的列表。当调用getView()方法时,根据数据创建或复用一个View,并在这个View中...

    listView item不同布局demo

    总结来说,"listView item不同布局demo"是一个展示如何在ListView中实现多类型item布局的实例,通过自定义Adapter和复写关键方法,我们可以灵活地控制ListView每一项的显示样式,从而满足各种复杂的需求。...

    android ListView Item展开效果

    这就涉及到了“android ListView Item展开效果”的实现。 ListView的Item展开效果通常通过使用ExpandableListView来实现。ExpandableListView是ListView的一个扩展,它不仅支持普通的单行显示,还能处理分组(Group...

    Android编程实现ListView中item部分区域添加点击事件功能

    本文实例讲述了Android编程...一开始想着是不是能在list item的布局给上层布局添加一个: android:clickable=false android:focusable=false 就是禁止点击,但试了试没有效果,后来师傅提醒我,我的这个listview使

    Android ListView adapter不同布局

    "Android ListView adapter不同布局"这个主题就是关于如何在ListView中实现这样的功能。 首先,我们了解ListView的工作原理。ListView依赖于Adapter来填充数据。Adapter就像一个桥梁,连接数据源(如ArrayList)和...

    android 在listview的item中显示不同的布局信息

    总之,在Android中实现ListView的Item显示不同布局,需要通过自定义Adapter,根据数据源动态加载不同的布局文件,并填充对应的内容。熟练掌握这一技巧,将有助于你构建更加丰富、灵活的用户界面。

    ListView Item多布局的实现

    然而,有时我们不仅仅满足于单一的列表项布局,而是希望在同一个ListView中展示多种不同的布局,这就是所谓的"ListView Item多布局"。这种功能可以使得应用界面更加丰富多彩,提供更好的用户体验。本文将详细介绍...

    Android中ListView包含多个Item

    本篇将深入讲解如何在Android中创建一个ListView,并实现它包含多个不同类型的Item。 1. **ListView基本结构** ListView由一系列的View(Item)组成,每个View代表数据集中的一个条目。这些Item通过Adapter进行...

    android的ListView点击item使item展开的做法

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要实现点击ListView的某一项(item)时,该item能够展开显示更多的内容,例如子列表或者详细信息。这个功能可以通过...

    ListView默认Item选中状态

    3. 自定义Item布局: 默认的选中效果可能并不符合所有设计需求,所以可能需要自定义Item的布局。在XML布局文件中,我们可以为选中状态定义不同的背景颜色、边框等样式,然后在`getView()`方法中根据选中状态应用...

Global site tag (gtag.js) - Google Analytics