【问题标题】:Android RecyclerView onClick in different ActivityAndroid RecyclerView onClick 在不同的Activity
【发布时间】:2018-07-07 02:32:32
【问题描述】:

一切正常,我的 recyclerView 中的 onClick 正在获取我的项目的位置,但我的设计要求能够单击 recyclerView 的项目并打开一个新活动(作为弹出窗口或弹出)。我可以做到这一点,但我的问题来自我需要在弹出窗口上显示的信息。活动内部的信息是这样的(在 Firebase 值调用内部)

attributeList.removeAll(attributeList);
for (DataSnapshot child : dataSnapshot.child("Attribute").getChildren()){
   Attribute attribute = child.getValue(Attribute.class);
            attribute_list newAttributeList = new attribute_list( attribute.Name + ": " + attribute.Value);
            attributeList.add(newAttributeList);
}
attributeAdapter = new attribute_list_adapter(attributeList, getContext());
recyclerAttribute.setAdapter(attributeAdapter);

这非常适合显示信息,但与点击相关的不仅仅是“值”和“名称”。

基本上,当我选择一个项目时,我需要获取单击的项目的位置(我有)并将其与属性列表中的位置进行比较,以便我可以调用 Firebase 调用(或以某种方式传递数据)到弹出框显示“属性”类中的值(例如名称、值、描述和另一个列表 (recyclerView)。

我的回收站视图:

    public class attribute_list_adapter extends RecyclerView.Adapter<attribute_list_adapter.ViewHolder> {

    private List<attribute_list> listItems;
    private Context context;

    public attribute_list_adapter(List<attribute_list> listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.attribute_list, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        attribute_list listItem = listItems.get(position);

        holder.txtTitle.setText(listItem.getTxtTitle());
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView txtTitle;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
        }

        @Override
        public void onClick(View v) {

        }
    }
}

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    这是一个例子:

    public class attribute_list_adapter extends RecyclerView.Adapter<attribute_list_adapter.ViewHolder> {
    
    private List<attribute_list> listItems;
    private Context context;
    
    public attribute_list_adapter(List<attribute_list> listItems, Context context) {
        this.listItems = listItems;
        this.context = context;
    }
    
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.attribute_list, parent, false);
        return new ViewHolder(v);
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
       holder.itemView.setOnClickListener(new View.onClickListener() {
       @Override
       public void onClick(View v) {
         onItemClickListener.onItemClick(position);
       }
    });
    
    }
    
    
    @Override
    public int getItemCount() {
        return listItems.size();
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView txtberita;
        ImageView imgberita;
        TextView txtnama;
        public ViewHolder(View itemView) {
            super(itemView);
            txtnama = (TextView) itemView.findViewById(R.id.txtnama);
            txtberita = (TextView) itemView.findViewById(R.id.txtberita);
            imgberita = (ImageView) itemView.findViewById(R.id.imgberita);
        }
    }
    
       public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        this.onItemClickListener = onItemClickListener;
    }
    
    OnItemClickListener onItemClickListener;
    
      public interface OnItemClickListener{
        void onItemClick(int position);
    }
    }
    

    您的活动。在 Oncreate() 中

     public class TestActivity extends AppCompatActivity implements attribute_list_adapter.OnItemClickListener {
    
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        attribute_list_adapter adapter = new attribute_list_adapter(listItems, this);
         adapter.setOnItemClickListener(this);
    }
    
      @Override
    public void onItemClick(int position) {
       // code here
    }
    }
    

    【讨论】:

    • 您必须更改 void onItemClick(int position); 处的值
    • 看起来很有希望。 your_adapter.setOnItemClickListener(this);行为不正确。当您指定“your_adapt”时,您是在说我的 RecyclerView.Adapter 变量吗?我的变量都没有这种方法来设置结果(我认为)为空。你有时间澄清一下吗?
    • 天才!非常喜欢!非常感谢 - 这确实使我能够做我需要的事情!
    • 你不会碰巧知道如何判断点击了哪个recyclerView?我有 5 个可以点击(我是为每个人制作一个自定义适配器还是可重复使用)?
    【解决方案2】:

    创建一个类似的接口

    public interface OnSingleItemClickListener{
    
    void onSingleItemClick(int position);
    }
    

    然后像这样在你的 ViewHolder 上实现它

    public class ViewHolder extends RecyclerView.ViewHolder implements OnSingleItemClickListener {
    
        public ViewHolder(View itemView) {
            super(itemView);
        }
    
    @Override
    void onSingleItemClick(int position){
    if(listItems.get(position) == listItems.get(getAdapterPosition)){
    // TODO do something here
        }
    
    }
    

    现在您必须在适配器内的 OnBindViewHolder 上执行此操作。

    holder.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view) {
            holder.onSingleItemClick(position);
          }
    }):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多