【问题标题】:Android, Can I get list data to persist when using a recyclerviewAndroid,我可以在使用 recyclerview 时让列表数据保持不变
【发布时间】:2020-12-23 03:54:40
【问题描述】:

我正在尝试使用 RecyclerView 在 .MainActivity 中显示数据列表。当我将 ListView 与适配器一起使用时,我可以使用单击的位置访问源数据 ArrayList,以便将列表元素传递给编辑活动。使用 RecyclerView,当 onListItemClicked 尝试访问它以获取列表元素并将其添加到 Intent 时,填充 RecyclerView 的 ArrayList 为 Null。我认为这是因为处理点击的机制是在 MainActivity 类之外完成的,这与 ListView 不同,因此一旦 onCreate 完成,该变量就不再存在,但我不确定。

我不想从视图中读取列表数据(是吗?)。除非有办法使这个列表持久化,否则我唯一能想到的就是让主要活动读取文件以构建列表,然后再次读取它以获取列表元素以传递给编辑活动,或者让主活动传递元素位置/索引并让编辑活动访问列表文件以检索元素。但是这两个似乎都需要大量的文件访问,并且需要编辑活动来管理列表以及主要活动。

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 时会出现问题。

【问题讨论】:

  • 你能贴出你的适配器的代码吗?

标签: java android android-recyclerview


【解决方案1】:

看起来您已经在 MainActivity 中实例化了一个新的 thisPlan 列表。在您的OnCreate 方法中,不要创建一个新的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
        ...
    }

【讨论】:

  • 呃,是的,就是这样。通过在 onCreate 中实例化一个新计划,从未创建过全局计划。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2015-11-22
  • 2011-01-21
  • 1970-01-01
  • 2017-04-15
  • 2013-07-04
相关资源
最近更新 更多