Implement multiple ViewHolder types in RecycleView adapter

后端 未结 9 1711
迷失自我
迷失自我 2020-12-13 16:34

It\'s maybe a discussion not a question.

Normal way to implement multiple types

As you know, if we want to implement multiple types in RecyclerView

9条回答
  •  北荒
    北荒 (楼主)
    2020-12-13 17:01

    Here you can use Dynamic method dispatch. Below i share my idea. //Activity Code

    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        ArrayList dataList = new ArrayList<>();
        dataList.add("Apple");
        dataList.add("Orange");
        dataList.add("Cherry");
        dataList.add("Papaya");
        dataList.add("Grapes");
        dataList.add(100);
        dataList.add(200);
        dataList.add(300);
        dataList.add(400);
        ViewAdapter viewAdapter = new ViewAdapter(dataList);
        recyclerView.setAdapter(viewAdapter);
    
    }
    
    
    

    }

    //Adapter code

    public class ViewAdapter extends RecyclerView.Adapter {
    private ArrayList dataList;
    public ViewAdapter(ArrayList dataList) {
        this.dataList = dataList;
    }
    
    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        BaseViewHolder baseViewHolder;
    
        if(viewType == 0) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_one,parent,false);
            baseViewHolder  = new ViewHolderOne(view);
        }else  {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_two,parent,false);
            baseViewHolder  = new ViewHolderSecond(view);
        }
        return baseViewHolder;
    }
    
    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        holder.bindData(dataList.get(position));
    }
    
    @Override
    public int getItemViewType(int position) {
        Object obj = dataList.get(position);
        int type = 0;
        if(obj instanceof Integer) {
            type = 0;
        }else if(obj instanceof String) {
            type = 1;
        }
        return type;
    }
    
    @Override
    public int getItemCount() {
        return dataList != null ? dataList.size() : 0;
    }
    
    
    

    }

    //Base View Holder Code.

    public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
    public BaseViewHolder(View itemView) {
        super(itemView);
    }
    
    public abstract void bindData(T data);
    

    }

    //View Holder One Source Code.

    public class ViewHolderOne extends BaseViewHolder {
    
    private TextView txtView;
    public ViewHolderOne(View itemView) {
        super(itemView);
        txtView = itemView.findViewById(R.id.txt_number);
    }
    
    @Override
    public void bindData(Integer data) {
        txtView.setText("Number:" + data);
    }
    

    }

    //View Holder Two

    public class ViewHolderSecond extends BaseViewHolder {
    
    private TextView textView;
    public ViewHolderSecond(View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.txt_string);
    }
    
    @Override
    public void bindData(String data) {
        textView.setText("Text:" + data);
    }
    

    }

    For project Source: enter link description here

    提交回复
    热议问题