1

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

我可以使用 onclick 方法实现这一点。

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

我的问题是

  1. 我可以在所有这 5 个地方使用这个适配器吗?

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

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

提前致谢!

4

1 回答 1

-1

(请参阅下面的 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();
    }
}
于 2015-12-11T15:58:50.730 回答