簡體   English   中英

項目管理他的點擊或呼叫監聽器? (recyclerView)

[英]Item manages his click or call listener ? (recyclerView)

我有一個RecyclerView ,其中包含多種項目類型(至少4或5)。 有些項目可以點擊,有時他們有兩個型動物clickListener (例如兩個imageView一個項目)。 現在,該項目自己管理點擊次數,如下所示:

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

但是我有一個問題:我需要在將要啟動的活動中放入一些變量,那么執行此操作的最佳方法是:

1)我的商品需要了解這些變量並繼續管理自己的點擊? 2)我的商品有一個listener ,該listener使用變量(例如片段或父活動或專用於此的對象)調用startActivity?

如果您需要更高的精度,請問我。

謝謝。

創建一個接口以傳遞這些值。

public interface MyRecyclerCallback {
    void onItemClicked(Integer o); //insert whatever you want to pass further, possibly translated to form packable to intents 
}
  • 然后像使用任何偵聽器一樣,將其從帶有回收器的活動添加到適配器中。 構造函數或單獨的方法。
  • 在創建每個孩子時,將其進一步傳遞給每個孩子。
  • 當使用適當的參數檢測到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;
        }
    }
}

這是處理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/

您可以在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;
   }

}

您已定義了一個自定義界面,以攔截recyclerview中的項目單擊:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM