通过另一个适配器访问适配器的数据 [英] accessing an adapter's data via another adapter

查看:98
本文介绍了通过另一个适配器访问适配器的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以通过另一个适配器访问适配器的数据?
我想开始一个活动并将数据从适配器传递到一个片段,该片段在 TabLayout 中用作三个片段之一,我有两个适配器和一个按钮单击该按钮可开始活动,它的Java代码在我的第一个适配器中,我需要通过第二个适配器本身
传递第二个适配器的数据,这是我的代码:

Is it all possible to access an adapter's data via another adapter? I want to start an activity and pass data from an adapter to a fragment which is used in TabLayout as one of three fragments, I have two adapters and a button which is clicked to start an activity, its Java code is in my first adapter and I need to pass second adapter's data via second adapter itself here is my codes:

我的第一个适配器:

public class RecyclerViewDataAdapter extends RecyclerView.Adapter<RecyclerViewDataAdapter.ItemRowHolder>{

    private ArrayList<SectionDataModel> dataList;
    private Context mContext;
    private RecyclerView.RecycledViewPool recycledViewPool;
    private SnapHelper snapHelper;

    public RecyclerViewDataAdapter(ArrayList<SectionDataModel> dataList, Context mContext) {
        this.dataList = dataList;
        this.mContext = mContext;
        recycledViewPool = new RecyclerView.RecycledViewPool();
    }

    @Override
    public ItemRowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null);
        ItemRowHolder rowHolder = new ItemRowHolder(v);
        snapHelper = new GravitySnapHelper(Gravity.START);
        return rowHolder;
    }

    @Override
    public void onBindViewHolder(ItemRowHolder holder, int position) {

        ArrayList singleSectionItems = dataList.get(position).getAllItemInSection();

        final String sectionName = dataList.get(position).getHeaderTitle();
        holder.itemTitle.setText(sectionName);

        SectionDataAdapter adapter = new SectionDataAdapter(singleSectionItems, mContext);
        holder.recyclerView.setHasFixedSize(true);
        holder.recyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
        holder.recyclerView.setAdapter(adapter);
        holder.recyclerView.setRecycledViewPool(recycledViewPool);
        snapHelper.attachToRecyclerView(holder.recyclerView);


        holder.btnMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//here i can start the activity but..(second adapter)
                Toast.makeText(view.getContext(), sectionName, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return (null != dataList ? dataList.size() : 0);
    }

    public class ItemRowHolder extends RecyclerView.ViewHolder {
        protected ImageView mitemImage;
        protected TextView mitemtext;
        protected TextView itemTitle;
        protected RecyclerView recyclerView;
        protected Button btnMore;

        public ItemRowHolder(View itemView) {
            super(itemView);
            this.mitemImage = itemView.findViewById(R.id.itemImage);
            this.mitemtext = itemView.findViewById(R.id.tvTitle);
            this.itemTitle = itemView.findViewById(R.id.itemTitle);
            this.recyclerView = itemView.findViewById(R.id.recycler_view_list);
            this.btnMore = itemView.findViewById(R.id.btnMore);
        }
    }
} '

和第二个适配器:

import java.net.PortUnreachableException;
import java.util.ArrayList;

public class SectionDataAdapter extends RecyclerView.Adapter<SectionDataAdapter.SssingleItemRowHolder>{

    private ArrayList<SingleItemModel> itemModels;
    private Context mContext;

    public SectionDataAdapter(ArrayList<SingleItemModel> itemModels, Context mContext) {
        this.itemModels = itemModels;
        this.mContext = mContext;
    }

@Override
public SingleItemRowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_single_card, null);
    SingleItemRowHolder singleItemRowHolder = new SingleItemRowHolder(v);
    return singleItemRowHolder;
}

@Override
public void onBindViewHolder(SingleItemRowHolder holder, int position) {
    SingleItemModel itemModel = itemModels.get(position);
    holder.tvTitle.setText(itemModel.getName());
    holder.mitemImage.setImageResource(itemModel.getImage());

}


@Override
public int getItemCount() {
    return (null != itemModels ? itemModels.size() : 0);
}

public class SingleItemRowHolder extends RecyclerView.ViewHolder {

    protected TextView tvTitle;
    protected ImageView mitemImage;


    public SingleItemRowHolder(View itemView) {
        super(itemView);

        final Intent intent = new Intent(mContext,MainActivity.class);
        this.mitemImage = itemView.findViewById(R.id.itemImage);
        this.tvTitle = itemView.findViewById(R.id.tvTitle);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//... need to start the activity from here
                Toast.makeText(view.getContext(), tvTitle.getText(), Toast.LENGTH_SHORT).show();
            }
        });

    }
}


推荐答案

@MilaDroid 一样,您只需要一个 getter 即可返回另一个 Adapter的 ArrayList< SingleItemModel> ,但是您将要面对的问题是,您需要具有相同的 Adapter 实例。 活动,以获取填充的 ArrayList< SingleItemModel>

Like @MilaDroid said you simply need a getter that returns the another Adapter's ArrayList<SingleItemModel> but the problem you will face is that you need to have the same instance of the Adapter from the Activity in order to get the populated ArrayList<SingleItemModel>.


一个好的解决方法是在 Adapter

$ b $中使用Bill Pugh的Singleton b

public class Adapter {

private ArrayList<SingleItemModel> list;

private Adapter() {}

public static Adapter getInstance() {
    return InstInit.INSTANCE;
}

// Don't forget to set the list (or NPE)
// because we can't argue with a Singleton
public void setList(ArrayList<SingleItemModel> list) {
    this.list = list;
}

// You can now get the ArrayList
public ArrayList<SingleItemModel> getList() {
    return list;
}

private static class InstInit {
    private static final Adapter INSTANCE = new Adapter();
}

// Overrided RecyclerView.Adapter Methods
.................

}




检索 ArrayList 假设以下适配器是Singleton

Retrieving the ArrayList assuming that the following Adapters are Singleton



AdapterOne a1 = AdapterOne.getInstance();
AdapterTwo a2 = AdapterTwo.getInstance();

ArrayList<SingleItemModel> a1RetrievedList = a1.getList();
// You don't need to create a new instance
// creating a new instance doesn't make sense
// because you need to repopulate the list
// for the new instance.

ArrayList<SingleItemModel> a2RetrievedList = a2.getList();
// You can also retrieve from AdapterTwo

这篇关于通过另一个适配器访问适配器的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆