ListView不同的项目布局(item layout)的实现

如果我们有这样的需求:每隔几个数据项出现一个分隔项。如图:


你需要做这些:

  1. 重写Adapter的getViewTypeCount() – 返回你有多少个不同的布局
  2. 重写Adapter的getItemViewType(int) – 由position返回view type id
  3. 根据view item的类型,在getView中创建正确的convertView
public class MultipleItemsList extends ListActivity {
    private MyCustomAdapter mAdapter;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new MyCustomAdapter();
        for (int i = 1; i < 50; i++) {
            mAdapter.addItem("item " + i);
            if (i % 4 == 0) {
                mAdapter.addSeparatorItem("separator " + i);
            }
        }
        setListAdapter(mAdapter);
    }
  
    private class MyCustomAdapter extends BaseAdapter {
  
        private static final int TYPE_ITEM = 0;
        private static final int TYPE_SEPARATOR = 1;
        private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
  
        private ArrayList mData = new ArrayList();
        private LayoutInflater mInflater;
  
        private TreeSet mSeparatorsSet = new TreeSet();
  
        public MyCustomAdapter() {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
  
        public void addItem(final String item) {
            mData.add(item);
            notifyDataSetChanged();
        }
  
        public void addSeparatorItem(final String item) {
            mData.add(item);
            // save separator position
            mSeparatorsSet.add(mData.size() - 1);
            notifyDataSetChanged();
        }
  
        @Override
        public int getItemViewType(int position) {
            return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
        }
  
        @Override
        public int getViewTypeCount() {
            return TYPE_MAX_COUNT;
        }
  
        @Override
        public int getCount() {
            return mData.size();
        }
  
        @Override
        public String getItem(int position) {
            return mData.get(position);
        }
  
        @Override
        public long getItemId(int position) {
            return position;
        }
  
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            int type = getItemViewType(position);
            System.out.println("getView " + position + " " + convertView + " type = " + type);
            if (convertView == null) {
                holder = new ViewHolder();
                switch (type) {
                    case TYPE_ITEM:
                        convertView = mInflater.inflate(R.layout.item1, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.text);
                        break;
                    case TYPE_SEPARATOR:
                        convertView = mInflater.inflate(R.layout.item2, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
                        break;
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }
  
    }
  
    public static class ViewHolder {
        public TextView textView;
    }
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现自定义布局可以使用自定义的Adapter,并在getView()方法中动态添加表格布局。 首先,在res/layout文件夹下新建一个xml文件,命名为table_item.xml,用于定义表格布局的样式。例如: ```xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:stretchColumns="0,1,2"> <TableRow> <TextView android:text="Name" android:padding="5dp" android:textSize="18sp" android:textStyle="bold" /> <TextView android:text="Age" android:padding="5dp" android:textSize="18sp" android:textStyle="bold" /> <TextView android:text="Gender" android:padding="5dp" android:textSize="18sp" android:textStyle="bold" /> </TableRow> <TableRow> <TextView android:id="@+id/tv_name" android:padding="5dp" android:textSize="16sp" /> <TextView android:id="@+id/tv_age" android:padding="5dp" android:textSize="16sp" /> <TextView android:id="@+id/tv_gender" android:padding="5dp" android:textSize="16sp" /> </TableRow> </TableLayout> ``` 然后,在Java代码中创建一个自定义的Adapter,重写getView()方法,动态添加表格布局: ```java public class TableAdapter extends ArrayAdapter<Person> { private int resource; public TableAdapter(Context context, int resource, List<Person> objects) { super(context, resource, objects); this.resource = resource; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { if(convertView == null){ convertView = LayoutInflater.from(getContext()).inflate(resource, parent, false); } TextView tvName = convertView.findViewById(R.id.tv_name); TextView tvAge = convertView.findViewById(R.id.tv_age); TextView tvGender = convertView.findViewById(R.id.tv_gender); Person person = getItem(position); tvName.setText(person.getName()); tvAge.setText(String.valueOf(person.getAge())); tvGender.setText(person.getGender()); return convertView; } } ``` 最后,在Activity中设置ListView的Adapter为自定义的Adapter即可: ```java public class MainActivity extends AppCompatActivity { private ListView listView; private List<Person> personList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.list_view); personList = new ArrayList<>(); personList.add(new Person("Tom", 20, "Male")); personList.add(new Person("Lucy", 18, "Female")); personList.add(new Person("Jack", 22, "Male")); TableAdapter adapter = new TableAdapter(this, R.layout.table_item, personList); listView.setAdapter(adapter); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值