2015-10-30 29 views
8

Zapełniłem okno recyclerView obrazem, tytułem i polem wyboru. Mam dwa problemy.Wyświetl listę zaznaczonych pól wyboru z widoku z recyklingu androida

  1. Sposób zaznaczenia pola wyboru po kliknięciu widoku obrazu lub całego elementu recyklingu.

  2. Muszę przejść do następnej czynności, pobierając wszystkie sprawdzone pozycje z recyklingu.

Mój układ:

<RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="8dp"> 

     <ImageView 
      android:id="@+id/image" 
      android:layout_width="match_parent" 
      android:layout_height="150dp" 
      android:layout_gravity="center_horizontal" 
      android:contentDescription="Interests" 
      android:scaleType="centerCrop" 
      android:src="@drawable/ic_yash_dp" /> 

     <TextView 
      android:id="@+id/title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_gravity="bottom" 
      android:layout_margin="5dp" 
      android:layout_marginTop="24dp" 
      android:background="@drawable/rounded_corners" 
      android:gravity="bottom" 
      android:padding="5dp" 
      android:text="GYM" 
      android:textAlignment="center" 
      android:textColor="@color/white" /> 

     <CheckBox 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/checkBox" 
      android:layout_margin="2dp" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentEnd="true" /> 

    </RelativeLayout> 

Mój adapter:

@Override 
public void onBindViewHolder(RecyclerViewHolder holder, int position) { 
final InterestBean model = arrayList.get(position); 
final int pos = position; 

RecyclerViewHolder mainHolder = (RecyclerViewHolder) holder;// holder 

Bitmap image = BitmapFactory.decodeResource(context.getResources(), 
     model.getImage());// This will convert drawbale image into bitmap 

// setting title 
mainHolder.title.setText(model.getTitle()); 
mainHolder.imageview.setImageBitmap(image); 
mainHolder.checkBox.setChecked(arrayList.get(position).isSelected()); 
mainHolder.checkBox.setTag(arrayList.get(position)); 


mainHolder.checkBox.setOnClickListener(new View.OnClickListener()  { 
public void onClick(View v) { 
CheckBox cb = (CheckBox) v; 
InterestBean contact = (InterestBean) cb.getTag(); 

contact.setIsSelected(cb.isChecked()); 
arrayList.get(pos).setIsSelected(cb.isChecked()); 
selectedItems.add(pos); 
Toast.makeText(
v.getContext(), pos + cb.isChecked(), Toast.LENGTH_LONG).show(); 
} 
});} 

Odpowiedz

22

Jedno proste rozwiązanie może być tak, że można utworzyć OnItemCheckLister, i wdrożyć go podobnym do następującego:

public class MyAdapter extends RecyclerViewAdapter { 

    interface OnItemCheckListener { 
     void onItemCheck(Item item); 
     void onItemUncheck(Item item); 
    } 

    ... 

    @NonNull 
    private OnItemCheckListener onItemCheckListener; 

    public MyAdapter (List<Item> items, @NonNull OnItemCheckListener onItemCheckListener) { 
     this.items = items; 
     this.onItemClick = onItemCheckListener; 
    } 

    ... 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof MyViewHolder) { 
      final Item currentItem = items.get(position); 

      ... 

      ((MyViewHolder) holder).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        ((MyViewHolder) holder).checkbox.setChecked(
          !((MyViewHolder) holder).checkbox.isChecked()); 
        if (((MyViewHolder) holder).checkbox.isChecked()) { 
         onItemClick.onItemCheck(currentItem); 
        } else { 
         onItemClick.onItemUncheck(currentItem); 
        } 
       } 
      }); 
     } 
    } 

    static class MyViewHolder extends RecyclerView.ViewHolder { 
     CheckBox checkbox; 
     View itemView; 

     ... 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      this.itemView = itemView; 
      checkbox = (CheckBox) itemView.findViewById(R.id.checkbox); 
      checkbox.setClickable(false); 
      ... 
     } 

     public void setOnClickListener(View.OnClickListener onClickListener) { 
      itemView.setOnClickListener(onClickListener); 
     } 
    } 
} 

Następnie w działalności, możemy to zrobić:

private List<Item> currentSelectedItems = new ArrayList<>(); 

    ... 

    myAdapter = new MyAdapter(items, new MyAdapter.OnItemCheckListener() { 
      @Override 
      public void onItemCheck(Item item) { 
       currentSelectedItems.add(item); 
      } 

      @Override 
      public void onItemUncheck(Item item) { 
       currentSelectedItems.remove(item); 
      } 
     }); 

Następnie możesz robić rzeczy z dowcipem h currentSelectedItems.

Uwaga: Ponieważ to rozwiązanie zakłada, że ​​cały element ma zostać naciśnięty, pole wyboru jest ustawione tak, aby nie było kliknięcia.

+0

To po prostu niesamowite, ludzie, proszę, skorzystajcie z tego rozwiązania! –

0

1) Możesz dodać mainHolder.imageview OnClickListener
2) Dwa krok:

  1. Add do modelu InterestBean boole n isChecked
  2. Gdzie iść do następnej czynności, zdobyć wszystkich InterestBeans, uzyskać wszystkie zaznaczone InterestBeans i zapisać.

Kod:

mainHolder.imageview.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick (View v) 
     { 
      mainHolder.checkBox.setChecked(!mainHolder.checkBox.isChecked()); 
     } 
    } 
    ); 
+0

Jak ustawić pole wyboru zaznaczone na zdjęciu click słuchacza. – Yashwanth

+0

piszę na komentarzu – andrey7mel

+0

mainHolder.imageview.setOnClickListener (nowa View.OnClickListener() { @Override public void onClick (View v) {// Jak ustawić go sprawdziliśmy basen } ?}); – Yashwanth

2

Możesz użyć Klasy modelu, aby uzyskać zaznaczone elementy recyclerView. Więcej referencyjny: Android Recyclerview checkbox

model

public class Model { 

    private boolean isSelected; 
    private String animal; 

    public String getAnimal() { 
     return animal; 
    } 

    public void setAnimal(String animal) { 
     this.animal = animal; 
    } 

    public boolean getSelected() { 
     return isSelected; 
    } 

    public void setSelected(boolean selected) { 
     isSelected = selected; 
    } 
} 

Adapter

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
    import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 


    public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> { 

private LayoutInflater inflater; 
public static ArrayList<Model> imageModelArrayList; 
private Context ctx; 

public CustomAdapter(Context ctx, ArrayList<Model> imageModelArrayList) { 

    inflater = LayoutInflater.from(ctx); 
    this.imageModelArrayList = imageModelArrayList; 
    this.ctx = ctx; 
} 

@Override 
public CustomAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = inflater.inflate(R.layout.rv_item, parent, false); 
    MyViewHolder holder = new MyViewHolder(view); 

    return holder; 
} 

@Override 
public void onBindViewHolder(final CustomAdapter.MyViewHolder holder, int position) { 

    holder.checkBox.setText("Checkbox " + position); 
    holder.checkBox.setChecked(imageModelArrayList.get(position).getSelected()); 
    holder.tvAnimal.setText(imageModelArrayList.get(position).getAnimal()); 

    // holder.checkBox.setTag(R.integer.btnplusview, convertView); 
    holder.checkBox.setTag(position); 
    holder.checkBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Integer pos = (Integer) holder.checkBox.getTag(); 
      Toast.makeText(ctx, imageModelArrayList.get(pos).getAnimal() + " clicked!", Toast.LENGTH_SHORT).show(); 

      if (imageModelArrayList.get(pos).getSelected()) { 
       imageModelArrayList.get(pos).setSelected(false); 
      } else { 
       imageModelArrayList.get(pos).setSelected(true); 
      } 
     } 
    }); 


} 

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

class MyViewHolder extends RecyclerView.ViewHolder { 

    protected CheckBox checkBox; 
    private TextView tvAnimal; 

    public MyViewHolder(View itemView) { 
     super(itemView); 

     checkBox = (CheckBox) itemView.findViewById(R.id.cb); 
     tvAnimal = (TextView) itemView.findViewById(R.id.animal); 
    } 

} 
0

Just Add dwie metody ominięcie recyclerview

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
}