Recycler在Activity中查看Onclick方法?

时间:2015-12-10 17:03:54

标签: android android-recyclerview recycler-adapter staggered-gridview

我尝试创建类似于Google Keep的用户界面。我知道如何使用Recycler View创建交错的视图。如果我点击特定卡。然后它必须打开一个活动。

我可以实现这个using onclick method.

同样的情况发生在我的应用程序中的至少5个不同的活动中。

我的问题是

  1. 我可以在这5个地方使用这个单一的适配器吗?

    1. 如果是,我应该在哪里进行onclick操作?

    2. 如果不是,我如何创建像Keep这样的交错布局?

  2. 提前致谢!

1 个答案:

答案 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();
    }
}