1

我正在尝试创建一个类似于Google Keep的UI。我知道如何使用Recycler View创建交错的View。如果我点击特定的卡片。然后它必须打开一个活动。Recycler查看Activity中的Onclick方法?

我能实现这个using onclick method.

这同样的情形发生在我的应用程序ATLEAST 5个不同的活动。

我的问题是,

  1. 我可以使用所有5个地方这种单一适配器?

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

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

先谢谢了!

+0

我很困惑你在哪里卡住。你提供的链接显示了如何做你想做的事情。所以也许这个问题不清楚。 – NoChinDeluxe

+1

如果我在我的适配器中使用Onclick方法。有用。然后对于另一个活动,我必须创建另一个适配器。所以它需要5个适配器及更多。这是一个好习惯吗? – user3467240

+0

如果所有五项活动都是相同的数据,那么您可以使用同一个适配器。但你为什么这样做。相反,您可以使用单个活动并使用按钮来更改视图。 – cgr

回答

-1

(请参阅编辑应用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(); 
    } 
} 
+0

问题指定使用“Recycler View”,并且您正在回答“List View”。回答时请小心。 –

+0

@VipulAsri - 哎呀,是的,你是对的。在尝试展示如何使用自定义适配器后,我更多地使用了自定义适配器,而BaseAdapter是其中一种更简单的方法。但你是对的,它应该为RecyclerView量身定做。当我有机会时,我会做一些编辑。 – NoChinDeluxe