【问题标题】:Inflate two types of .XML in RecyclerView在 RecyclerView 中膨胀两种类型的 .XML
【发布时间】:2016-09-10 22:11:18
【问题描述】:

由于我遇到的一个问题,我感到非常沮丧:如何为 RecyclerView 中的不同对象扩展不同的 .XML 文件?我已经做了力所能及的事了,比如制作一个 ListItemType 对象:

public class ListItemType {
    public static int NOTE_VIEW = 0;
    public static int CATEGORY_VIEW = 1;
}

还有一个 ListViewItem 对象:

public class ListViewItem {
    private int mType;
    private Object mObject;

    public ListViewItem(int type, Object object) {
        mType = type;
        mObject = object;
    }

    public int getType() {
        return mType;
    }

    public void setType(int type) {
        mType = type;
    }

    public Object getObject() {
        return mObject;
    }

    public void setObject(Object object) {
        mObject = object;
    }
}

我不知道我从这里去哪里。

【问题讨论】:

    标签: java android android-recyclerview android-inflate


    【解决方案1】:

    RecyclerView 实现

    首先,您必须添加/创建到/您的Model 类型以指示您的Model 类型,并知道要膨胀哪个布局:

    MyModel.java

    public class MyModel {
        public enum ModelTypes {
            TYPE_1,
            TYPE_2
        }
        // your model members ^^^
    
        ModelTypes type;
    }
    

    现在你必须创建你的ViewHolder,我建议创建一个父ViewHolder 类并使用子类扩展你的模型类型。

    MyHolder.java

    public class MyHolder extends RecyclerView.ViewHolder {
    
        // must have the ViewHolder default constructor
        public MyHolder(View itemView) {
            super(itemView);
        }
    
        public static MyHolder inflateViewByType(MyModel.ModelTypes type, 
                                                LayoutInflater layoutInflater, ViewGroup parent) {
            View view;
            switch (type) {
                case TYPE_1:
                    view = layoutInflater.inflate(R.layout.layout_type_1, parent, false);
                    return new MyHolderType1(view);
                break;
                case TYPE_2:
                    view = layoutInflater.inflate(R.layout.layout_type_2, parent, false);
                    return new MyHolderType2(view);
                break;
            }
            // Model type not supported
            return null;
        }
    }
    

    创建您的 ViewHolder 类型,在我的示例中,我只有两种类型。

    MyHolderType1.java

    public class MyHolderType1 extends MyHolder {
    
        // layout members
    
        public MyHolderType1(View itemView) {
            super(itemView);
            // init your layout members by for layout_type_1 by itemView.findViewById(...)
        }
    }
    

    MyHolderType2.java

    public class MyHolderType2 extends MyHolder {
    
        // layout members
    
        public MyHolderType2(View itemView) {
            super(itemView);
            // init your layout members by for layout_type_2 by itemView.findViewById(...)
        }
    }
    

    到目前为止,您只能创建 ViewHolder 类型来实现 RecyclerViewRecyclerView 必须有一个扩展默认 RecyclerView.AdapterAdapter,为此我们必须创建一个新类并使用我们的 ViewHolder 扩展 RecyclerView.Adapter

    MyRecyclerViewAdapter.java

    public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyHolder> {
    
        private List<MyModel> mData;
    
        public MyRecyclerViewAdapter(@NonNull List<MyModel> data) {
            mData = data;
        }
    
        @Override
        public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            MyModel.ModelTypes type = MyModel.ModelTypes.values()[viewType];
            return MyHolder.inflateViewByType(type, layoutInflater, parent);
        }
    
        @Override
        public void onBindViewHolder(MyHolder holder, int position) {
    
            MyModel model = mData.get(position);
            switch (model.type) {
                case TYPE_1:
                    setupViewType1((MyHolderType1) holder, model);
                    break;
                case TYPE_2:
                    setupViewType2((MyHolderType2) holder, model);
                    break;
            }
        }
    
        // to update the adapter data without reinitialize it
        public void updateData(@NonNull List<MyModel> newData) {
            mData = newData;
            notifyDataSetChanged();
        }
    
        private void setupViewType1(MyHolderType1 holder, MyModel model) {
    
            // do what you want with your views in layout_type_1
        }
    
        private void setupViewType2(MyHolderType2 holder, MyModel model) {
    
            // do what you want with your views in layout_type_2
        }
    
        @Override
        public int getItemCount() {
            return mData.size();
        }
    
        @Override
        public int getItemViewType(int position) {
            return mData.get(position).type.ordinal();
        }
    }
    

    继续,我们差不多完成了。 现在我们必须在我们的活动中初始化RecyclerView,并将MyRecyclerViewAdapter 的实例设置为它。 为此我们通过调用findViewById(...)在和xml中找到RecyclerView,然后将LayoutManager设置为RecyclerView,毕竟我们用我们的数据设置了适配器。

    MyActivity.java

    public class MyActivity extends Activity{
    
        // ....
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_layout);
    
    
            // init your views
            RecyclerView recyclerView = findViewById(R.id.recycler_view);
    
    
            // here you can pull or generate your recycler view list data
            List<MyModel> data = getData();
            MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(data);
    
    
            // set layout manager to the recycler view (Required)
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, 
                                                            LinearLayoutManager.VERTICAL, false);
            recyclerView.setLayoutManager(linearLayoutManager);
    
            // set the adapter to the recycler view (Required)
            recyclerView.setAdapter(adapter);
        }
    
        // ....
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2022-09-30
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多