【问题标题】:Performing different actions based on the list populating the recyclerview根据填充 recyclerview 的列表执行不同的操作
【发布时间】:2022-02-04 08:42:47
【问题描述】:

如何使用不同的列表填充我的 android recyclerview,以便根据列表执行不同的操作。例如,单击列表 A 中的一项与单击列表 B 中的一项不同。 我是否必须为每个适配器创建单独的适配器。

【问题讨论】:

  • 如果您想使用单个适配器,您可以使用不同的视图类型。链接 - droidbyme.medium.com/…
  • @Siddarth - 我没有在同一个 recyclerview 上使用多个布局。这是一个单一的布局,但在不同的时间填充了不同的列表,并且不同列表的点击操作会有所不同

标签: android android-recyclerview adapter


【解决方案1】:

您应该有一个界面来处理来自不同列表的不同操作:

public interface handleRecyclerViewClicksInterface {
    public void handleListAClick();
    public void handleListBClick();
    public void handleListCClick();
}

那么你的适配器应该是这样的:

package com.wimova.driver.service;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;

import com.wimova.driver.component.adapter.NewRidesAdapter;

import java.util.ArrayList;
import java.util.List;

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

    private HandleRecyclerViewClicksInterface handleRecyclerViewClicksInterface;
    
    private List<String> myDataset = new ArrayList<>();

    public MyAdapter(HandleRecyclerViewClicksInterface handleRecyclerViewClicksInterface){
        this.handleRecyclerViewClicksInterface = handleRecyclerViewClicksInterface;
    }

    @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        switch (viewType) {
            case 2:
                return new MyViewHolder(parent, view -> handleRecyclerViewClicksInterface.handleBClick());
            case 3:
                return new MyViewHolder(parent, view -> handleRecyclerViewClicksInterface.handleCCLick());
            default:
                return new MyViewHolder(parent, view -> handleRecyclerViewClicksInterface.handleAClick()); // here we will treat the cases < 2 or > 3
        }

    }

    @Override
    public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
        // handle on bind
    }

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

    protected static class MyViewHolder extends RecyclerView.ViewHolder {

        public MyViewHolder(@NonNull View itemView, View.OnClickListener onClickListener) {
            super(itemView);
            itemView.setOnClickListener(onClickListener);
        }
    }

    @Override
    public int getItemViewType(int position) {
        // Return the correct item view type depending on the dataset (you need to implement your own logic)
        if(myDataset.get(position).equals("handleA")){
            return 1;
        }
        if(myDataset.get(position).equals("handleB")){
            return 2;
        }
        if(myDataset.get(position).equals("handleC")){
            return 3;
        }
        // it it match no case, return the default one
        return 1;
    }
}




class MainActivity extends Activity {
    
    private RecyclerView recyclerView;
    
    private MyAdapter adapter;
    
    private HandleRecyclerViewClicksInterface handleRecyclerViewClicksInterface;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        recyclerView = findViewById(R.id.main_recyclerview);
        
        handleRecyclerViewClicksInterface = new HandleRecyclerViewClicksInterface() {
            @Override
            public void handleAClick() {
                // Example : Launch other activity
            }

            @Override
            public void handleBClick() {
                // Example : Send notification
            }

            @Override
            public void handleCCLick() {
               //  Example : Delete row
            }
        };
        adapter = new MyAdapter(handleRecyclerViewClicksInterface);
        recyclerView.setAdapter(adapter);
    }
}

【讨论】:

    【解决方案2】:

    更好的方法是创建单独的适配器(如果列表不是太多)将列表放在要显示列表的主文件的框架布局中

    <FrameLayout.....</FrameLayout>
    

    然后根据选择的列表替换框架为所有列表创建不同的片段并在它们各自的片段类中处理它们

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多