物品管理他的点击或通话听众? (recyclerView)

时间:2016-08-26 13:15:53

标签: android android-recyclerview listener

我有一个RecyclerView,其中包含多种项目类型(至少4或5个)。 可以单击某些项目,有时它们有两个不同的clickListener(例如,在一个项目中有两个imageView)。 目前,该项目管理自己的点击次数如下:

item.imageView1.setOnClickListener(....){
     startActivity(Activity2);
}
item.imageView2.setOnClickListener(....){
     startActivity(Activity1);
}

但我有一个问题:我需要在将要启动的活动中放入一些变量,那么最好的方法是什么:

1)我的项目需要知道这些变量并继续管理自己的点击? 2)我的项目有listener,它使用变量调用startActivity(比如片段或父活动或专用于此的对象)?

如果您需要更多精确度,请问我。

THX。

3 个答案:

答案 0 :(得分:1)

建立一个传递这些值的界面。

public interface MyRecyclerCallback {
    void onItemClicked(Integer o); //insert whatever you want to pass further, possibly translated to form packable to intents 
}
  • 然后像使用任何监听器一样,使用recycleler将活动添加到适配器。构造函数或单独的方法。
  • 在创作之后将其传递给每个孩子。
  • 使用适当的参数检测到onClick时调用它。

    实际的论点可能是一些抽象的东西 取决于你的逻辑。这更像是一个普遍的想法。这就是我与回收商一起做的方式。

在您的活动中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mRecycler = (RecyclerView) findViewById(R.id.recycler);
    MyAdapter adapter = new MyAdapter(this,new MyRecyclerCallback() {
        @Override
        public void onItemClicked(Integer o) { //any argument you like, might be an abstract 
            Intent i = new Intent(this,ActivityTwo.class);
            i.putExtra(EXTRA_VALUE,o);
            startActivity(i);
        }
    });
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setAdapter(adapter);
}

适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Child>{
    private final Context mContext;
    private final MyRecyclerCallback mCallback;
    private List<Integer> mChildren;

    public MyAdapter(Context ctx, MyRecyclerCallback myRecyclerCallback) {
        mContext = ctx;
        mCallback = myRecyclerCallback;
        mChildren = new ArrayList<>();
    }

    public void populateList(List<Integer> list ) { //this can be a network call or whatever you like
        mChildren.addAll(list);
    }

    @Override
    public Child onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
        return new Child(v,mCallback);
    }

    @Override
    public void onBindViewHolder(Child holder, int position) {
        holder.setValue1(mChildren.get(position)*3);
        holder.setValue2(mChildren.get(position));
    }

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

    public class Child extends RecyclerView.ViewHolder{

        View mView1;
        View mView2;
        private int mValue1;
        private int mValue2;


        public Child(View itemView, final MyRecyclerCallback mCallback) {
            super(itemView);
            mView1 = itemView.findViewById(R.id.view1);
            mView2 = itemView.findViewById(R.id.view2);

            mView1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mCallback.onItemClicked(mValue1);
                }
            });

            mView2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mCallback.onItemClicked(mValue2);
                }
            });
        }

        public void setValue1(int position) {
            mValue1 = position;
        }

        public void setValue2(int position) {
            mValue2=position;
        }
    }
}

答案 1 :(得分:0)

这是处理onclick和onlongclick

的一个很好的替代方案
ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
    @Override
    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
        // do it
    }
});

http://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/

答案 2 :(得分:0)

您可以在ViewHolder类上使用单个OnClickListener,并将其与接口一起使用以确定已单击的项目类型。

例如,假设您有一个名为Item的模型类:

public class Item {

   private int itemType;
   private String itemDescription;
   private String optionalExtra;

   public static final int ITEM_TYPE_1 = 1;
   public static final int ITEM_TYPE_2 = 2;

   public Item(int itemType, String itemDescription) {
      this.itemType = itemType;
      this.itemDescription = itemDescription;
   }

   public Item(int itemType, String itemDescription, String optionalExtra) {
      this.itemType = itemType;
      this.itemDescription = itemDescription;
      this.optionalExtra = optionalExtra;
   }

}

您定义了一个自定义界面来拦截clicklerview中的点击项目:

public interface CustomClickListener {
   void onClickOfItemType1( int position );
   void onClickOfItemType2( int position );
}

在适用于recyclerview的适配器内部,在viewholder类中:

//Similar implementation for other ViewHolders too.
public class ViewHolderType1 extends RecyclerView.ViewHolder implements View.OnClickListener {

    ImageView imageView;
    TextView textView;
    View itemView;
    public ViewHolderType1(View view) {
       super(view);
       this.itemView = view;
       //initialize other views here

       //Set item click listener on your view
       itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
      int itemPosition = getAdapterPosition();
      if( itemPosition != RecyclerView.NO_POSITION ) {
          customClickListener.onClickOfItemType1(itemPosition);
          //You can call onClickOfItemType2(itemPosition) in your other type of view holder class
      } 
    }

}

在您的活动或片段中:

将customClickListener作为参数传递给adapeter:

CustomAdapter customAdapter = new CustomAdapter(List<Item> itemList, new CustomClickListener {
   @Override
   void onClickOfItemType1(int position) {
      Item item = itemList.get(position);
      //This item is of type 1 
      //You can implement serializable / parcelable in your item class and use it to directly pass across item to your activity
      Intent intent = new Intent(Activity.this, CustomActivity1.class);
      intent.putExtra("item", item);
      startActivity(intent);
   }
   @Override
   void onClickOfItemType2(int position) {
      Item item = itemList.get(position);
      //This item is of type 2 
      //You can implement serializable / parcelable in your item class and use it to directly pass across item to your activity
      Intent intent = new Intent(Activity.this, CustomActivity2.class);
      intent.putExtra("item", item);
      startActivity(intent);
   }
});

如果您尝试在点击不同视图时触发不同的活动;在viewclicklistener实现中检查视图id并触发相应的活动。

@Override
    public void onClick(View v) {
      int itemPosition = getAdapterPosition();
      if( itemPosition != RecyclerView.NO_POSITION ) {
          switch(v.getId()) {
             case R.id.imageView :
             customClickListener.onClickOfItemType1(itemPosition);
             break;
             case R.id.textView :
             customClickListener.onClickOfItemType2(itemPosition);
             break;
          }

       } 
    }

这是使用RecyclerView的指南:

https://guides.codepath.com/android/using-the-recyclerview