0

我有一個RecyclerView完整的元素,在這種情況下是CardViews,我也有一個開關,根據狀態排序RecyclerView的元素,所以根據這個元素改變它們的位置,我想去一個不同的活動從回收站視圖的每一個元素,但我有點卡住,因爲我還沒有找到任何來源,以我的方式初始化元素的數據。如何從此RecyclerView開始活動?

這裏是RECYCLERVIEW:

public class CategoriesRecyclerView extends Activity { 
    private List<Categories> categories; 
    private RecyclerView rv; 
    private Switch categoriesSortingSwitch; 
    private TextView switchStatus; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.categories_recycler_view); 


     rv = (RecyclerView) findViewById(R.id.cardList); 
     rv.setHasFixedSize(true); 
     LinearLayoutManager llm = new LinearLayoutManager(this); 
     llm.setOrientation(LinearLayoutManager.VERTICAL); 
     rv.setLayoutManager(llm); 

     initializeData(); 

     final CategoriesAdapter ca = new CategoriesAdapter(categories); 
     rv.setAdapter(ca); 



     //IMPLEMENTACIÓN DE EL SORTING POR MEDIO DE EL SWITCH 
     categoriesSortingSwitch = (Switch) findViewById(R.id.switchsortcategories); 
     switchStatus = (TextView) findViewById(R.id.testswitch); 
     //set the switch to OFF 
     categoriesSortingSwitch.setChecked(false); 
     //attach a listener to check for changes in state 
     categoriesSortingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

       if(isChecked){ 
        switchStatus.setText("Sorting alphabetically"); 


        Collections.sort(categories, new Comparator<Categories>() { 
         @Override 
         public int compare(Categories lhs, Categories rhs) { 
          return lhs.title.compareTo(rhs.title); 
         } 
        }); 


        ca.notifyDataSetChanged(); 

       }else{ 
        switchStatus.setText("Sorting by popularity"); 

        Collections.sort(categories, new Comparator<Categories>() { 
         @Override 
         public int compare(Categories rhs, Categories lhs) { 
          return lhs.title.compareTo(rhs.title); 
         } 
        }); 

       ca.notifyDataSetChanged(); 
       } 

      } 
     }); 


     //check the current state before we display the screen 
     if(categoriesSortingSwitch.isChecked()){ 
      switchStatus.setText("Sorting alphabetically"); 


      Collections.sort(categories, new Comparator<Categories>() { 
       @Override 
       public int compare(Categories lhs, Categories rhs) { 
        return lhs.title.compareTo(rhs.title); 
       } 
      }); 


     } 
     else { 
      switchStatus.setText("Sorting by popularity"); 

      Collections.sort(categories, new Comparator<Categories>() { 
       @Override 
       public int compare(Categories rhs, Categories lhs) { 
        return lhs.title.compareTo(rhs.title); 
       } 
      }); 

     } 

    } 

    private void initializeData() { 


     categories = new ArrayList<>(); 
     categories.add(new Categories("CARS", "CARS")); 
     categories.add(new Categories("SPORTS", "SPORTS")); 
     categories.add(new Categories("GAMING", "GAMING")); 
     categories.add(new Categories("GAMBLING", "GAMBLING")); 
     categories.add(new Categories("TECH", "TECH")); 
     categories.add(new Categories("NATURE", "NATURE")); 
     categories.add(new Categories("RANDOM", "RANDOM")); 
     categories.add(new Categories("COUSINE", "COUSINE")); 
     categories.add(new Categories("HISTORY", "HISTORY")); 
     categories.add(new Categories("MUSIC", "MUSIC")); 
     categories.add(new Categories("STUDIES", "STUDIES")); 
    } 

} 

這裏是適配器:

public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.CategoriesViewHolder> { 

    private List<Categories> categoriesList; 

    public CategoriesAdapter(List<Categories> categoriesList) { 
     this.categoriesList = categoriesList; 

    } 


    public static class CategoriesViewHolder extends RecyclerView.ViewHolder { 

     CardView cv; 
     TextView title; 
     TextView category_title; 

     //ImageView category_img; CUANDO VALLA A REMPLAZAR LA FORO DE CATEGORIA 

     CategoriesViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView)itemView.findViewById(R.id.card_view); 
      title = (TextView)itemView.findViewById(R.id.title); 
      category_title = (TextView)itemView.findViewById(R.id.category_title); 
      //category_img = (ImageView)itemView.findViewById(R.id.category_picture); 

     } 

    } 

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

    @Override 
    public void onBindViewHolder(CategoriesViewHolder categoriesViewHolder, final int i) { 
     Categories ci = categoriesList.get(i); 

     categoriesViewHolder.title.setText(categoriesList.get(i).title); 
     categoriesViewHolder.category_title.setText(categoriesList.get(i).category_title); 
     //categoriesViewHolder.categori_img.setImageResource(categoriesList.get(i).photoId); 
    } 

    @Override 
    public CategoriesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_row, viewGroup, false); 

     return new CategoriesViewHolder(itemView); 
    } 
} 

我會很感激如何做到這一點的任何指令。 非常感謝。

回答

0

將您的ViewHolder設置爲實現View.OnClickListener。在onClick()方法中,您可以調用ViewHolder.getAdapterPosition()並檢查該位置中的項目應該啓動哪個活動。

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    ViewHolder(View itemView) { 
     super(itemView); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     int position = getAdapterPosition(); 

     // Logic to start correct activity class based on position 
    } 
} 

這樣做可以確保您只在ViewHolder創建時創建新的偵聽器。如果您在onBindView()中創建新偵聽器,則每次滾動時都會創建新對象。

另一種選擇是使用不同的視圖類型。根據您在onClick中想要的行爲,將您的適配器設置爲在getItemViewType()中返回不同的整數。然後,在onCreateViewHolder()中,可以添加一個OnClickListener並使用該整數(作爲viewType參數傳遞)來確定其行爲。但是,如果您的所有列表項都啓動了不同的活動,那麼這意味着您需要爲每個項目單獨使用一種View類型,然後它們將不會被非常有效地回收。

+0

爲了使用上下文初始化新的活動,必須對我的代碼進行一些更改,它現在正在工作,非常感謝。 –

+0

@Sebastian,你可以通過調用itemView.getContext()來獲取ViewHolder中的上下文,並且不需要改變其他的東西。 – Brucelet

2

RecyclerView產品Click集開始新的活動,爲onCreateViewHolder行根查看的onClick監聽器:在category_row佈局

@Override 
    public CategoriesViewHolder onCreateViewHolder(ViewGroup viewGroup,int i){ 
     View itemView =....; 
     itemView.setClickable(true); 
     itemView.setOnClickListener(new View.OnClickListener() 
      { 
      @Override 
      public void onClick(View view) 
      { 
       // starte new Activity here 
      } 
     }); 
     return new CategoriesViewHolder(itemView); 
    } 

並且如果孩子的意見,如果可聚焦,然後爲每個視圖設置android:duplicateParentState="true"

+0

但我如何讓它爲RecyclerView的每個元素提供不同的活動?提前致謝。 –

+0

@SebastianDelgado:然後在'onClick'方法內添加開關盒,以便根據行點擊開始不同的活動 –

+0

非常感謝。 –

0

在onBindViewHolder中執行此操作。

@Override 
public void onBindViewHolder(CategoriesViewHolder categoriesViewHolder, final int i) { 
    final Categories ci = categoriesList.get(i); 

    categoriesViewHolder.title.setText(categoriesList.get(i).title); 
    categoriesViewHolder.category_title.setText(categoriesList.get(i).category_title); 
    //categoriesViewHolder.categori_img.setImageResource(categoriesList.get(i).photoId); 

    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // launch activity by Categories 

     } 
    }); 
}