android,我可以在使用recyclerview时获取要持久化的列表数据吗

ogq8wdun  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(303)

我正在尝试使用recyclerview显示.mainactivity中的数据列表。当我将listview与适配器一起使用时,我可以使用单击的位置来访问源数据arraylist,以便将list元素传递给编辑活动。使用recyclerview,当onlistitemclicked试图访问它以获取list元素并将其添加到intent时,填充recyclerview的arraylist为null。我假设这是因为处理点击的机制是在mainactivity类之外完成的,与listview不同,因此一旦创建完成,变量就不再存在,但我不确定。
我不想从视图中读取列表数据(是吗?)。除非有办法让这个列表持久化,否则我唯一能想到的就是要么让主活动读取一个文件来构建列表,然后再读取一次,让list元素传递给edit活动,或者让主活动传递元素位置/索引,让编辑活动访问列表文件以检索元素。但这两种方法似乎都需要大量的文件访问,需要edit活动来管理列表和主活动。

public class MainActivity extends AppCompatActivity
        implements PlanAdapter.ListItemClickListener
{
    // View elements
    private RecyclerView planDisplay;

    // Adapter for building the RecyclerView
    private PlanAdapter mListAdapter;

    // Layout manager for the RecyclerView
    RecyclerView.LayoutManager layoutManager;

    // Plan list
    private static ArrayList<PlanElement> thisPlan;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        planDisplay = findViewById(R.id.rv_plan_display);

        ArrayList<PlanElement> thisPlan = buildThisPlan();

        layoutManager =
                new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        planDisplay.setLayoutManager(layoutManager);
        planDisplay.setHasFixedSize(true);

        mListAdapter = new PlanAdapter(thisPlan, this);
        planDisplay.setAdapter(mListAdapter);

    }

    @Override
    public void onListItemClick(int clickedItemIndex)
    {
        Intent i = new Intent(MainActivity.this, EditPlanItemActivity.class);

        i.putExtra("elementNumber", clickedItemIndex + 1);

// Where the error occurs
        i.putExtra("PlanElement", thisPlan.get(clickedItemIndex));

        startActivity(i);
    }

}
public class PlanAdapter extends RecyclerView.Adapter<PlanAdapter.AdapterViewHolder>
{
    private ArrayList<PlanElement> thisPlan;

    final private ListItemClickListener mOnClickListener;

    // Click Listener Interface
    public interface ListItemClickListener
    {
        void onListItemClick(int clickedItemIndex);
    }

    public PlanAdapter(ArrayList<PlanElement> aPlan, ListItemClickListener listener)
    {
        thisPlan = aPlan;
        mOnClickListener = listener;
    }

    @NonNull
    @Override
    public PlanAdapter.AdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        Context context = parent.getContext();
        int layoutListItem = R.layout.list_element;

        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(layoutListItem, parent, false);

        return new AdapterViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull AdapterViewHolder holder, int position)
    {
        PlanElement thisElement = thisPlan.get(position);

        holder.textItem1Display.setText(String.format("%d", thisElement.getItem1()));
    holder.textItem2Display.setText(String.format("%d", thisElement.getItem2()));

    }

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

    public class AdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
        public TextView textItem1Display;
        public TextView textItem2Display;

        public AdapterViewHolder(@NonNull View itemView)
        {
            super(itemView);

            textItem1Display = itemView.findViewById(R.id.textItem1);
            textItem2Display = itemView.findViewById(R.id.textItem2);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view)
        {
            int clickedPosition = getAdapterPosition();
            mOnClickListener.onListItemClick(clickedPosition);
        }
    }
}

好的,添加了我的适配器。但适配器工作正常。当onclick方法试图访问空的arraylist时,就会出现问题。

628mspwn

628mspwn1#

看起来你已经示例化了一个新的 thisPlan 列出你的主要活动。在你的 OnCreate 方法,而不是创建新的arraylist,使用已经创建的arraylist。
而不是这样:

protected void onCreate(Bundle savedInstanceState)
    {
        ...
        ArrayList<PlanElement> thisPlan = buildThisPlan(); //created a new instace
        ...
    }

请执行以下操作:

protected void onCreate(Bundle savedInstanceState)
    {
        ...
        thisPlan = buildThisPlan(); // use the one you already created
        ...
    }

相关问题