(请参阅编辑应用RecyclerView下文)
就像我在我的评论中提到,它肯定是细到对所有的活动,使用不同的数据和观点单独的适配器。随着您的应用数据和布局变得越来越复杂,您的代码也变得越来越复杂......这就是它的方式。
但是,如果您的某些活动在其ListView中使用了类似的数据(例如,可能是两个TextView和一个ImageButton),您可以通过定义可用于多个活动的单个适配器来节省一些工作量。然后,您会为每个Activity实例化单独的对象,类似于创建多个ArrayAdapter<String>
对象以填充多个ListViews的方式。
编写自定义适配器时,BaseAdapter
是一个很好的类。它非常灵活,并且可以完全控制ListView中显示的数据。这里有一个小例子:
public class CustomBaseAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> listData;
public CustomBaseAdapter(Context context, ArrayList<String> listData) {
this.context = context;
this.listData = listData;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.your_list_item_layout, parent, false);
//populate the view with your data -- some examples...
TextView textData = (TextView) convertView.findViewById(R.id.yourTextView);
textData.setText(listData.get(position));
ImageButton button = (ImageButton) convertView.findViewById(R.id.yourImageButton);
button.setOnClickListener(new View.OnClickListener() {
//...
//...
});
}
return convertView;
}
@Override
public Object getItem(int position) {
return 0;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getCount() {
return listData.size();
}
}
所以这段代码的关键部分是明显的getView()
方法,被称为每次ListView控件需要一些数据来显示时间。为了提高效率,视图被存储在一个名为convertView
的东西中,以便它们可以被重复使用,并且不必在每次屏幕上出现视图时都充气。
因此,我们在getView()
中所做的工作首先要查明convertView
是否存在。如果是这样,我们只是将它传递给调用的ListView,因为所有东西都应该已经实例化并准备好了。如果convertView
为空,则意味着数据尚未实例化(或因任何原因需要重新实例化),因此我们膨胀一个全新的视图并使用我们的数据填充它。
在上面这个例子中适配器的情况下
所以,如果您的几个活动的所有显示的字符串的一个列表,你可以重复使用该适配器为每一个,您创建了一个新的每次路过不同ArrayList<String>
通过构造目的。但是如果你有更多的数据可以显示,你显然可以传递更多的信息。复杂程度取决于您。如果你的活动之间的差异太大了,我会为它们全部创建这个类的自定义版本,只是将它们实例化并填充它们,然而你愿意。它将保持所有数据的组织和封装。
希望这会有所帮助!如果您需要,可随时提出问题以获得更多解释。
编辑回应评论
由于您使用的是RecyclerView,而不是仅仅简单的列表视图(我,出于某种原因,完全忘了),你仍然可以做的非常相似使用RecyclerView.Adapter<YourViewHolder>
东西代替。区别在于,不是在getView()
方法中夸大视图,而是在您定制的ViewHolder
内膨胀,而我假设您已拥有该视图。代码可能看起来像这样:
public class CustomRecyclerViewAdapter extends RecyclerView.Adapter<StringViewHolder> {
private final List<String> items;
public CustomRecyclerViewAdapter(ArrayList<String> items) {
this.items = items;
}
@Override
public StringViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//So instead of inflating the views here or in a getView() like in
//in the BaseAdapter, you would instead inflate them in your custom
//ViewHolder.
return new StringViewHolder(parent);
}
@Override
public void onBindViewHolder(StringViewHolder holder, int position) {
holder.setModel(items.get(position));
}
@Override
public long getItemId(int position) {
return items.get(position).hashCode();
}
@Override
public int getItemCount() {
return items.size();
}
}
我很困惑你在哪里卡住。你提供的链接显示了如何做你想做的事情。所以也许这个问题不清楚。 – NoChinDeluxe
如果我在我的适配器中使用Onclick方法。有用。然后对于另一个活动,我必须创建另一个适配器。所以它需要5个适配器及更多。这是一个好习惯吗? – user3467240
如果所有五项活动都是相同的数据,那么您可以使用同一个适配器。但你为什么这样做。相反,您可以使用单个活动并使用按钮来更改视图。 – cgr