我正在尝试使用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时,就会出现问题。
1条答案
按热度按时间628mspwn1#
看起来你已经示例化了一个新的
thisPlan
列出你的主要活动。在你的OnCreate
方法,而不是创建新的arraylist,使用已经创建的arraylist。而不是这样:
请执行以下操作: