【发布时间】: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