我正在尝试创建一个类似于Google Keep的用户界面。我知道如何使用 Recycler View 创建交错视图。如果我单击特定卡。然后它必须打开一个活动。
我可以使用 onclick 方法实现这一点。
同样的情况发生在我的应用程序中至少 5 个不同的活动中。
我的问题是
我可以在所有这 5 个地方使用这个适配器吗?
如果是,我应该在哪里放置 onclick 操作?
如果不是,如何创建像 Keep 这样的交错布局?
提前致谢!
我正在尝试创建一个类似于Google Keep的用户界面。我知道如何使用 Recycler View 创建交错视图。如果我单击特定卡。然后它必须打开一个活动。
我可以使用 onclick 方法实现这一点。
同样的情况发生在我的应用程序中至少 5 个不同的活动中。
我的问题是
我可以在所有这 5 个地方使用这个适配器吗?
如果是,我应该在哪里放置 onclick 操作?
如果不是,如何创建像 Keep 这样的交错布局?
提前致谢!
(请参阅下面的 RecyclerView 应用程序编辑)
就像我在评论中提到的那样,为所有使用不同数据和视图的活动设置单独的适配器当然很好。随着您的应用程序数据和布局变得越来越复杂,您的代码也变得越来越复杂……就是这样。
但是,如果您的一些活动在它们的 ListView 中使用了类似的数据——例如,可能是两个 TextView 和一个 ImageButton——你可以通过定义一个可用于多个活动的适配器来节省一些工作量。然后,您将为每个 Activity 实例化单独的对象,类似于创建多个ArrayAdapter<String>
对象以填充多个 ListView 的方式。
在编写自定义适配器时,这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需要一些数据显示的时候都会调用这个方法。为了提高效率,视图存储在称为 a 的东西中,convertView
因此它们可以被重复使用,而不必在每次视图出现在屏幕上时都膨胀。
所以我们要做的getView()
是首先找出是否convertView
存在。如果是这样,我们只需将其传递回调用 ListView,因为一切都应该已经实例化并准备就绪。如果convertView
为空,则表示数据尚未实例化(或出于任何原因需要重新实例化),因此我们扩充了一个全新的视图并用我们的数据填充它。
所以在上面这个示例适配器的情况下,如果你的几个活动都显示一个字符串列表,你可以为每个活动重用这个适配器,每次ArrayList<String>
创建一个新对象时通过构造函数传递一个不同的适配器。但显然,如果您有更多数据要显示,您可以传递的不仅仅是字符串。复杂程度取决于您。如果您的活动之间的差异太大,我将为所有活动创建此类的自定义版本,然后实例化它们并根据您的需要填充它们。它将使您的所有数据保持井井有条和封装。
希望这可以帮助!如果您需要,请随时提出问题以获得更多说明。
编辑回应评论
由于您使用的是 RecyclerView 而不是普通的 ListViews(出于某种原因,我完全忘记了),您仍然可以使用 a 来做非常相似的事情RecyclerView.Adapter<YourViewHolder>
。不同之处在于,它们不是在方法中膨胀视图,而是getView()
在您的 custom 中膨胀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();
}
}