溫馨提示×

android viewholder能處理多種視圖類型嗎

小樊
118
2024-12-02 10:54:47
欄目: 編程語言

是的,Android的ViewHolder模式可以處理多種視圖類型。為了實現這個功能,你需要在Adapter中的getItemViewType()方法中根據不同的視圖類型創建不同的ViewHolder。然后,在onBindViewHolder()方法中,根據傳入的視圖類型綁定相應的數據。

以下是一個簡單的示例:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<Object> dataList; // 數據源,可以是多種類型的數據

    public MyAdapter(List<Object> dataList) {
        this.dataList = dataList;
    }

    @Override
    public int getItemViewType(int position) {
        // 根據position返回不同的視圖類型
        if (dataList.get(position) instanceof String) {
            return 0;
        } else if (dataList.get(position) instanceof Integer) {
            return 1;
        } else {
            return 2;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // 根據視圖類型創建不同的ViewHolder
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == 0) {
            View view = inflater.inflate(R.layout.item_string, parent, false);
            return new StringViewHolder(view);
        } else if (viewType == 1) {
            View view = inflater.inflate(R.layout.item_integer, parent, false);
            return new IntegerViewHolder(view);
        } else {
            View view = inflater.inflate(R.layout.item_other, parent, false);
            return new OtherViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // 根據視圖類型綁定相應的數據
        Object item = dataList.get(position);
        if (holder instanceof StringViewHolder) {
            ((StringViewHolder) holder).textView.setText((String) item);
        } else if (holder instanceof IntegerViewHolder) {
            ((IntegerViewHolder) holder).textView.setText(String.valueOf((Integer) item));
        } else {
            ((OtherViewHolder) holder).textView.setText(item.toString());
        }
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    // 定義不同的ViewHolder類
    static class StringViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        StringViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
        }
    }

    static class IntegerViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        IntegerViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
        }
    }

    static class OtherViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        OtherViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text_view);
        }
    }
}

這個示例中,我們定義了一個MyAdapter類,它繼承自RecyclerView.Adapter。在getItemViewType()方法中,我們根據數據源中的不同類型返回不同的視圖類型。然后,在onCreateViewHolder()方法中,我們根據視圖類型創建不同的ViewHolder。最后,在onBindViewHolder()方法中,我們根據視圖類型綁定相應的數據。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女