我尝试创建类似于Google Keep的用户界面。我知道如何使用Recycler View创建交错的视图。如果我点击特定卡。然后它必须打开一个活动。
我可以实现这个using onclick method.
同样的情况发生在我的应用程序中的至少5个不同的活动中。
我的问题是
我可以在这5个地方使用这个单一的适配器吗?
如果是,我应该在哪里进行onclick操作?
如果不是,我如何创建像Keep这样的交错布局?
提前致谢!
答案 0 :(得分:-1)
(参见以下编辑中的RecyclerView申请表)
就像我在评论中提到的那样,为所有使用不同数据和视图的活动提供单独的适配器当然没问题。随着您的应用数据和布局变得越来越复杂,您的代码也越来越复杂......这就是它的方式。
但是如果你的一些活动在他们的ListViews中使用了类似的数据 - 例如,两个TextViews和一个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需要显示一些数据时都会调用该方法。为了提高效率,视图存储在称为convertView
的内容中,因此可以重复使用它们,并且每次视图出现在屏幕上时都不必充气。
因此,我们在getView()
中所做的是首先查明convertView
是否存在。如果是这样,我们只是将其传递回调用ListView,因为所有内容都应该已经实例化并准备就绪。如果convertView
为空,则表示数据尚未实例化(或者无论出于何种原因需要重新实例化),因此我们将全新视图展开并用我们的数据填充它。
因此,对于上面这个示例适配器的情况,如果你的几个活动都显示了一个字符串列表,你可以为每一个重用这个适配器,每次你通过构造函数传入一个不同的ArrayList<String>
创建了一个新对象。但显然,如果您有更多数据要显示,您可以传递的不仅仅是字符串。复杂程度取决于您。如果你的活动之间的差异太大,我会为所有这些创建这个类的自定义版本,只是实例化它们并填充它们,不管你喜欢什么。它将使您的所有数据保持非常有条理和封装。
希望这有帮助!如果需要,请随时提出问题以获得更多说明。
编辑回应评论
由于您使用的是RecyclerView而不仅仅是普通的ListViews(由于某些原因,我完全忘记了),您仍然可以使用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();
}
}