listView 添加多个不同的adapter

有时候我们想在listView上分类,或者呢 有时候一行显示两列内容,有时候需要三列内容 ,那怎么实现呢,这里呢就要使用

Java代码 
  1. class Section {  
  2.         String caption;  
  3.         Adapter adapter;  
  4.           
  5.         Section(String caption, Adapter adapter) {  
  6.             this.caption=caption;  
  7.             this.adapter=adapter;  
  8.         }  
  9.     }  

 

自定义一个类,这个类呢包含多个adapter就可以了,想用那种就用那种。

Java代码 
  1. abstract public class SectionedAdapter extends BaseAdapter {  
  2.     abstract protected View getHeaderView(String caption,int index,View convertView,ViewGroup parent);  
  3.       
  4.     private List<Section> sections=new ArrayList<Section>();  
  5.     private static int TYPE_SECTION_HEADER=0;  
  6.   
  7.     public SectionedAdapter() {  
  8.         super();  
  9.     }  
  10.   
  11.     public void addSection(String caption, Adapter adapter) {  
  12.         sections.add(new Section(caption, adapter));  
  13.     }  
  14.   
  15.     public Object getItem(int position) {  
  16.         for (Section section : this.sections) {  
  17.             if (position==0) {  
  18.                 return(section);  
  19.             }  
  20.               
  21.             int size=section.adapter.getCount()+1;  
  22.   
  23.             if (position<size) {  
  24.                 return(section.adapter.getItem(position-1));  
  25.             }  
  26.   
  27.             position-=size;  
  28.         }  
  29.           
  30.         return(null);  
  31.     }  
  32.   
  33.     public int getCount() {  
  34.         int total=0;  
  35.           
  36.         for (Section section : this.sections) {  
  37.             total+=section.adapter.getCount()+1// add one for header  
  38.         }  
  39.           
  40.         return(total);  
  41.     }  
  42.   
  43.     public int getViewTypeCount() {  
  44.         int total=1;    // one for the header, plus those from sections  
  45.           
  46.         for (Section section : this.sections) {  
  47.             total+=section.adapter.getViewTypeCount();  
  48.         }  
  49.           
  50.         return(total);  
  51.     }  
  52.   
  53.     public int getItemViewType(int position) {  
  54.         int typeOffset=TYPE_SECTION_HEADER+1;   // start counting from here  
  55.           
  56.         for (Section section : this.sections) {  
  57.             if (position==0) {  
  58.                 return(TYPE_SECTION_HEADER);  
  59.             }  
  60.               
  61.             int size=section.adapter.getCount()+1;  
  62.   
  63.             if (position<size) {  
  64.                 return(typeOffset+section.adapter.getItemViewType(position-1));  
  65.             }  
  66.   
  67.             position-=size;  
  68.             typeOffset+=section.adapter.getViewTypeCount();  
  69.         }  
  70.           
  71.         return(-1);  
  72.     }  
  73.   
  74.     public boolean areAllItemsSelectable() {  
  75.         return(false);  
  76.     }  
  77.   
  78.     public boolean isEnabled(int position) {  
  79.         return(getItemViewType(position)!=TYPE_SECTION_HEADER);  
  80.     }  
  81.   
  82.     @Override  
  83.     public View getView(int position, View convertView,  
  84.                                             ViewGroup parent) {  
  85.         int sectionIndex=0;  
  86.           
  87.         for (Section section : this.sections) {  
  88.             if (position==0) {  
  89.                 return(getHeaderView(section.caption, sectionIndex,convertView, parent));  
  90.             }  
  91.   
  92.             int size=section.adapter.getCount()+1;  
  93.   
  94.             if (position<size) {  
  95.                 return(section.adapter.getView(position-1,  convertView,parent));  
  96.             }  
  97.   
  98.             position-=size;  
  99.             sectionIndex++;  
  100.         }  
  101.           
  102.         return(null);  
  103.     }  
  104.   
  105.     @Override  
  106.     public long getItemId(int position) {  
  107.         return(position);  
  108.     }  
  109.   
  110.     class Section {  
  111.         String caption;  
  112.         Adapter adapter;  
  113.           
  114.         Section(String caption, Adapter adapter) {  
  115.             this.caption=caption;  
  116.             this.adapter=adapter;  
  117.         }  
  118.     }  
  119. }  

 

然后主类就是

Java代码 
  1. public class SectionedDemo extends ListActivity {  
  2.     private static String[] items={"lorem""ipsum""dolor","purus"};  
  3.       
  4.     @Override  
  5.     public void onCreate(Bundle icicle) {  
  6.         super.onCreate(icicle);  
  7.         setContentView(R.layout.main);  
  8.           
  9.         adapter.addSection("Original",new ArrayAdapter<String>(this,  
  10.                                                     android.R.layout.simple_list_item_1,  
  11.                                                     items));  
  12.           
  13.         List<String> list=Arrays.asList(items);  
  14.           
  15.         Collections.shuffle(list);  
  16.   
  17.         adapter.addSection("Shuffled",new ArrayAdapter<String>(this,  
  18.                                                     android.R.layout.simple_list_item_1,  
  19.                                                     list));  
  20.           
  21.         list=Arrays.asList(items);  
  22.           
  23.         Collections.shuffle(list);  
  24.   
  25.         adapter.addSection("Re-shuffled",new ArrayAdapter<String>(this,  
  26.                                                     android.R.layout.simple_list_item_1,  
  27.                                                     list));  
  28.           
  29.         setListAdapter(adapter);  
  30.     }  
  31.       
  32.     SectionedAdapter adapter=new SectionedAdapter() {  
  33.         protected View getHeaderView(String caption, int index,View convertView,ViewGroup parent) {  
  34.             TextView result=(TextView)convertView;  
  35.               
  36.             if (convertView==null) {  
  37.                 result=(TextView)getLayoutInflater().inflate(R.layout.header, null);  
  38.             }  
  39.               
  40.             result.setText(caption);  
  41.               
  42.             return(result);  
  43.         }  
  44.     };  
  45. }  

 

其他的就需要你自己变化了,我这里只是吧内容打乱。

 有些东西我只是简单调解没有源码或者我认为很简单的就不提供了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android ListView的一行中显示多个元素,可以使用自定义布局。以下是如何实现它的步骤: 1. 创建一个自定义布局文件,例如row_layout.xml。在此文件中,可以添加多个元素,例如ImageView、TextView等。 2. 在适配器中重写getView()方法。在此方法中,可以将自定义布局文件中的元素与数据绑定,并将其添加ListView的每一行中。 3. 在Activity中,将适配器绑定到ListView上。 以下是一个示例代码: row_layout.xml: ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/imageView" android:layout_width="50dp" android:layout_height="50dp" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" /> </LinearLayout> ``` CustomAdapter.java: ``` public class CustomAdapter extends ArrayAdapter<String> { public CustomAdapter(Context context, ArrayList<String> data) { super(context, 0, data); } @Override public View getView(int position, View convertView, ViewGroup parent) { View itemView = convertView; if (itemView == null) { LayoutInflater inflater = LayoutInflater.from(getContext()); itemView = inflater.inflate(R.layout.row_layout, parent, false); } ImageView imageView = itemView.findViewById(R.id.imageView); TextView textView = itemView.findViewById(R.id.textView); // 绑定数据 String item = getItem(position); imageView.setImageResource(R.drawable.icon); textView.setText(item); return itemView; } } ``` MainActivity.java: ``` public class MainActivity extends AppCompatActivity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listView); ArrayList<String> data = new ArrayList<>(); data.add("Item 1"); data.add("Item 2"); data.add("Item 3"); CustomAdapter adapter = new CustomAdapter(this, data); listView.setAdapter(adapter); } } ``` 在此示例中,我们创建了一个自定义布局文件row_layout.xml,其中包含一个ImageView和一个TextView。然后,我们在CustomAdapter中重写了getView()方法,将数据绑定到自定义布局文件中的元素上,并将每个元素添加ListView的每一行中。最后,在MainActivity中,我们将适配器绑定到ListView上,以显示多个元素的每一行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值