Android ListView 分类显示(二)多布局显示

主要是实现ListView的getItemViewType和getViewTypeCount两个方法,对于分类本身也占用一个item。

package com.example.categorylistview.adapter;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.categorylistview.R;
import com.example.categorylistview.bean.ImageCategory;
import com.example.categorylistview.bean.ImageCategory.Image;

public class CategoryAdapter extends BaseAdapter{

    private static final int TYPE_CATEGORY_ITEM = 0;
    private static final int TYPE_ITEM = 1;

    private List<ImageCategory> mListData;
    private LayoutInflater mInflater;

    public CategoryAdapter(Context context, List<ImageCategory> pData) {
        mListData = pData;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        int count = 0;

        if (null != mListData) {
            // 所有分类中item的总和是ListVIew Item的总个数
//            for (ImageCategory category : mListData) {
//                count += category.
//            }
            count = mListData.size();
        }

        return count;
    }

    @Override
    public Object getItem(int position) {
        // 同一分类内,第一个元素的索引值
        int categroyFirstIndex = 0;
        for (ImageCategory category : mListData) {
            int size = category.getItemCount();
            // 在当前分类中的索引值
            int categoryIndex = position - categroyFirstIndex;
            // item在当前分类内
            if (categoryIndex < size) {
                return category.getItem(categoryIndex);
            }
            // 索引移动到当前分类结尾,即下一个分类第一个元素索引
            categroyFirstIndex += size;
        }
        return null;
    }

    public Object getItemName(int position) {
        // 同一分类内,第一个元素的索引值
        int categroyFirstIndex = 0;
        for (ImageCategory category : mListData) {
            int size = category.getItemCount();
            // 在当前分类中的索引值
            int categoryIndex = position - categroyFirstIndex;
            // item在当前分类内
            if (categoryIndex < size) {
                 return category.categoryName;
            }
            categroyFirstIndex += size;
        }
        return null;
    }

    @Override
    public int getItemViewType(int position) {
        int categroyFirstIndex = 0;
        for (ImageCategory category : mListData) {
            int size = category.getItemCount();
            // 在当前分类中的索引值
            int categoryIndex = position - categroyFirstIndex;
            if (categoryIndex == 0) {
                return TYPE_CATEGORY_ITEM;
            }
            categroyFirstIndex += size;
        }
        return TYPE_ITEM;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        int itemViewType = getItemViewType(position);
        CategoryHolder categoryHolder;
        ViewHolder viewHolder = null;
        switch (itemViewType) {
            case TYPE_CATEGORY_ITEM:
                if (null == convertView) {
                    categoryHolder = new CategoryHolder();
                    convertView = mInflater.inflate(R.layout.category, null);
                    categoryHolder.tv_category_title = (TextView) convertView.findViewById(R.id.tv_category_title);
                    convertView.setTag(categoryHolder);
                } else {
                    categoryHolder = (CategoryHolder) convertView.getTag();
                }
                String itemName = (String) getItemName(position);
                categoryHolder.tv_category_title.setText(""+itemName);
                break;
            case TYPE_ITEM:
                if (null == convertView) {
                    convertView = mInflater.inflate(R.layout.activity_main, null);
                    viewHolder = new ViewHolder();
                    viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
                    viewHolder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                ImageCategory.Image image = (Image) getItem(position);
                String text = image.name+" "+image.size+" "+image.date;
                // 绑定数据
                viewHolder.tv_title.setText(text);
                viewHolder.iv_icon.setImageResource(R.drawable.logo);
                break;
        }

        return convertView;
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        return getItemViewType(position) != TYPE_CATEGORY_ITEM;
    }

    private class ViewHolder {
        TextView tv_title;
        ImageView iv_icon;
    }
    private static class CategoryHolder {
        TextView tv_category_title;
    }

}
public class ImageCategory {

    public String categoryName;

    public List<Image> images;

    public static class Image {

        public String name;
        public String url;
        public String size;
        public String date;

        public Image(String name, String url, String size, String date) {
            super();
            this.name = name;
            this.url = url;
            this.size = size;
            this.date = date;
        }

    }

    public Object getItem(int pPosition) {
        // Category排在第一位
        if (pPosition == 0) {
            return this;
        } else {
            return images.get(pPosition - 1);
        }
    }

    /**
     * 当前类别Item总数。Category也需要占用一个Item
     * 
     * @return
     */
    public int getItemCount() {
        return images.size() + 1;
    }

}
public class DataSource {

    public static List<ImageCategory> getCategorys(){
        List<ImageCategory> categorys = new ArrayList<ImageCategory>();
        for (int i = 0; i < 5; i++) {
            ImageCategory category = new ImageCategory();
            category.categoryName="分类"+i;
            List<Image> mImages = new ArrayList<Image>();
            for (int j = 0; j < 5; j++) {
                Image image = new Image(category.categoryName+"- 风景图片"+i,"image/path/"+j,"3"
                        ,"2015-"+i+"-2"+j);
                mImages.add(image);
            }
            category.images = mImages;
            categorys.add(category);
        }
        return categorys;
    }

}
public class MainActivity extends Activity {
    ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = (ListView) findViewById(R.id.lv_data);

        mListView.setAdapter(new CategoryAdapter(this, DataSource.getCategorys()));

        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String name = "";
                int type = mListView.getAdapter().getItemViewType(position);
                if (type ==CategoryAdapter.TYPE_CATEGORY_ITEM) {
                    ImageCategory category = (ImageCategory) mListView.getAdapter().getItem(position);
                    name = category.categoryName;
                }else if (type ==CategoryAdapter.TYPE_ITEM) {
                    Image category = (Image) mListView.getAdapter().getItem(position);
                    name = category.name+" - "+category.size;
                }
                Toast t = Toast.makeText(getApplicationContext(), name+"", 0);
                t.show();

            }

        });

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值