2016-03-22 19 views
0

ile nasıl değiştirebilirim? Textview ve Checkbox ile Recyclerview kullanıyorum. Her öğe gizlenebilir veya gösterilebilir. MainActivity'de, sadece gizli olmayan öğeleri gösteririm. Ama menüde gizli öğeler göstereceğim bir seçenek var. tıklatmak da Öğeleri gizledim ama gri renk ile. HOw yapabilir miyim? Recyclerview'in tek öğesinin özelliklerine MainActivity'den nasıl ulaşılır? İşte Android: Recyclerview öğesinin öğe özelliklerini MainActivity

benim kodudur:

RVAdapter

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.DataHolder> { 

    static String LOG = "RV_LOG"; 
    ArrayList<DataObject> myData; 
    MainActivity mainActivity; 
    public static MyClickListener myClickListener; 

    public class DataHolder extends RecyclerView.ViewHolder implements View.OnClickListener, 
      CompoundButton.OnCheckedChangeListener { 
     TextView text; 
     CheckBox checkBox; 
     private int position; 
     public DataHolder(View itemView) { 
      super(itemView); 
      text = (TextView) itemView.findViewById(R.id.text); 
      checkBox = (CheckBox) itemView.findViewById(R.id.checkbox); 

      checkBox.setOnCheckedChangeListener(this); 
     } 

     public void setPosition(int value) { 
      this.position = value; 
     } 


     @Override 
     public void onClick(View v) { 
      myClickListener.onItemClick(position, v); 
     } 

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

      mainActivity.onItemClick(position, buttonView, isChecked); 

     } 
    } 

    public void setOnItemClickListener(MyClickListener myClickListener) { 
     this.myClickListener = myClickListener; 
    } 

    public RVAdapter(ArrayList<DataObject> myData, MainActivity mainActivity) { 
     this.myData = myData; 
     this.mainActivity=mainActivity; 
    } 

    @Override 
    public DataHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.layout_single_item, parent, false); 

     return new DataHolder(view); 
    } 


    @Override 
    public void onBindViewHolder(final DataHolder holder, final int position) { 

     holder.text.setText(myData.get(position).getText()); 
     holder.checkBox.setChecked(myData.get(position).getCheck()); 
     if (myData.get(position).getHidden()) { 
      holder.text.setTextColor(Color.parseColor("#d6d6c2")); 
      holder.text.setVisibility(View.GONE); 
      holder.checkBox.setVisibility(View.GONE); 
     } 
     holder.setPosition(position); 
    } 


    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    public void addItem(DataObject object, int index) { 
     myData.add(index, object); 
     notifyItemInserted(index); 
    } 

    public void deleteItem(int index) { 
     myData.remove(index); 
     notifyItemRemoved(index); 
    } 

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

    public interface MyClickListener { 
     public void onItemClick(int position, View v); 
    } 
} 

MainActivity:

public class MainActivity extends AppCompatActivity { 

    private RecyclerView myRecyclerView; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager manager; 


    private ArrayList<DataObject> data; 
    String TAG = "MA Tag"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     data = new ArrayList<DataObject>(); 
     boolean hidden = true; 
     for (int i = 0; i < 10; i++) { 
      DataObject object = new DataObject("Item No " + (i + 1), false, hidden); 
      data.add(i, object); 
      hidden = !hidden; 
     } 

     myRecyclerView = (RecyclerView) findViewById(R.id.rv); 
     myRecyclerView.setHasFixedSize(true); 
     adapter = new RVAdapter(data, this); 
     myRecyclerView.setAdapter(adapter); 
     manager = new LinearLayoutManager(this); 
     myRecyclerView.setLayoutManager(manager); 

    } 

    public void onItemClick(int position, View view, boolean isChecked) { 
     switch (view.getId()) { 
      case R.id.text: 
       Log.d(TAG, "item is clicked"); 
       break; 

      case R.id.checkbox: 
       data.get(position).setCheck(isChecked); 
       Log.d(TAG, position + " is " + data.get(position).getCheck() + ":" + isChecked); 
       if (isChecked) { 
        data.get(position).setCheck(true); 
       } else { 
        data.get(position).setCheck(false); 
        Log.d(TAG, position + " is " + data.get(position).getCheck()); 

       } 
       break; 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.delete: 

       for(int i = data.size()-1; i >=0; i--){ 
        if(data.get(i).getCheck()) 
         ((RVAdapter) myRecyclerView.getAdapter()).deleteItem(data.indexOf(data.get(i))); 
        } 

       break; 
      case R.id.show: 
       Log.d(TAG, "Show"); 
       for(int i = 0; i <data.size(); i++){ 
        if(data.get(i).getHidden()){ 
         Log.d(TAG, data.get(i).getText()); 
         data.get(i).setHidden(false); 
        } 
       } 

       break; 

     } 
     return true; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.layout_menu, menu); 
     return true; 
    } 
} 

GÜNCELLEME:

şimdi benim RVAdapter böylece görünür:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.DataHolder> { 

    static String LOG = "RV_LOG"; 
    ArrayList<DataObject> myData; 
    MainActivity mainActivity; 

    public class DataHolder extends RecyclerView.ViewHolder implements View.OnClickListener, 
      CompoundButton.OnCheckedChangeListener, View.OnLongClickListener { 
     TextView text; 
     CheckBox checkBox; 
     private int position; 
     public DataHolder(View itemView) { 
      super(itemView); 
      text = (TextView) itemView.findViewById(R.id.text); 
      checkBox = (CheckBox) itemView.findViewById(R.id.checkbox); 

      checkBox.setOnCheckedChangeListener(this); 
      text.setOnLongClickListener(this); 
     } 

     public void setPosition(int value) { 
      this.position = value; 
     } 

     @Override 
     public void onClick(View v) { 
      mainActivity.onItemClick(position, v, true); 
     } 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      mainActivity.onItemClick(position, buttonView, isChecked); 
     } 

     @Override 
     public boolean onLongClick(View v) { 
      mainActivity.onLongClick(position); 
      return true; 
     } 
    } 

    public RVAdapter(ArrayList<DataObject> myData, MainActivity mainActivity) { 
     this.myData = myData; 
     this.mainActivity=mainActivity; 
    } 

    @Override 
    public DataHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.layout_single_item, parent, false); 

     return new DataHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final DataHolder holder, final int position) { 

     holder.text.setText(myData.get(position).getText()); 
     holder.checkBox.setChecked(myData.get(position).getCheck()); 
     if (myData.get(position).getHidden()) { 
      holder.text.setVisibility(View.GONE); 
      holder.checkBox.setVisibility(View.GONE); 
     } 

     if(myData.get(position).getWasHidden()){ 
      holder.text.setTextColor(Color.parseColor("#666666")); 
     } 
     holder.setPosition(position); 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    public void deleteItem(int index) { 
     myData.remove(index); 
     notifyItemRemoved(index); 
     notifyItemRangeChanged(index, myData.size()); 
    } 

    public void hideItem(int position){ 
     myData.get(position).setHidden(true); 

    } 

    public void showItem(int position){ 
     myData.get(position).setHidden(false); 
     notifyDataSetChanged(); 
    } 

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

Etkinliğim, showItem() yöntemini çağırıyorum.

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.delete: 
       for(int i = data.size()-1; i >=0; i--){ 
        if(data.get(i).getCheck()) 
         ((RVAdapter) myRecyclerView.getAdapter()).deleteItem(data.indexOf(data.get(i))); 
        } 
       break; 
      case R.id.show: 
       for(int i = 0; i< data.size(); i++) { 
        if(data.get(i).getHidden()) 
        ((RVAdapter) myRecyclerView.getAdapter()).showItem(i); 
       } 
       adapter.notifyDataSetChanged(); 
       break; 
     } 
     return true; 
    } 

Biraz yanlış çalışır: vadede de her ikinci öğe gösterilir (doğru, gizli değil her saniye sebep). Göster'e dokunduğumda, gizli öğeler görünür, ancak ilk iki öğe kaybolur. Tekrar göster üzerine dokunduğumda görünürler. burada sorun nedir?

cevap

1

Gizli öğeleri göstermek için bağdaştırıcının içinde bir yöntem oluşturun. Ana Etkinliğinizin içindeki adaptör nesnesine sahip olduğunuzdan, Ana Etkinliğinizin içinden bu yöntemi kolayca arayabilirsiniz. Bu yöntemi çağırdıktan sonra, MainActivity'inizin kendisinden notifyDataSetChanged() yöntemini çağırın. adaptör nesnesi tarafından notifyDataSetChanged() yöntemi çağrılır.

+0

iyi işe yaradı, ama burada bir sorun vardır: 'public void showHiddenItems() {için (0 = int i; i myData.size (<); i ++) { if (myData.get (i) .getHidden()) { myData.get (i) .setHidden (yanlış); } } } ' ve itemClick işlevinde: 'durumda R.id.show. ((RVAdapter) myRecyclerView.getAdapter()) showHiddenItems(); adapter.notifyDataSetChanged(); kırılması; ' Gizli öğeleri göster üzerine tıklıyorum, ilk iki gizli öğeyi göstermiyor. Tekrar tıklıyorum ve hepsini gösterir. (her ikinci öğe gizlidir) – Astgh

+0

Lütfen adaptör kodunuzu en son kodunuzla güncelleyin. O zaman bu hata ile size yardımcı olacağım. –

+0

Kodunuz doğru görünüyor. Hala bu hatayı aldın mı? –

İlgili konular