2016-03-22 2 views
0

У меня есть Recyclerview с Textview и Checkbox. Каждый элемент может быть скрыт или показан. В MainActivity во время выполнения я показываю только те элементы, которые не скрыты. Но в меню у меня есть опция - показывать скрытые элементы. при щелчке у меня есть t oshow также скрытые элементы, но с серым цветом. HOw я могу сделать это? как достичь свойств одного элемента Recyclerview из MainActivity?Android: Как изменить свойства элементов Recyclerview из MainActivity

Вот мой код:

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; 
    } 
} 

UPDATE:

теперь мой RVAdapter выглядит так:

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(); 
    } 
} 

в моей деятельности Я вызываю метод showItem().

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; 
    } 

Он работает немного не так: При пробеге каждый второй элемент показан (правильно, вызывают каждый второй не скрыт). Когда я нажимаю «Показать», появляются скрытые элементы, но первые два показанных элемента исчезают. Когда я снова нажимаю «Показать», они появляются. что здесь не так?

ответ

1

Создайте метод внутри адаптера, чтобы показать скрытые элементы. Поскольку у вас есть объект адаптера внутри основной деятельности, вы можете легко вызвать этот метод из своей основной деятельности. После вызова этого метода вызовите метод notifyDataSetChanged() из самого MainActivity. Метод notifyDataSetChanged() будет вызываться объектом адаптера.

+0

хорошо, он работал, но у меня есть вопрос здесь: 'общественные недействительные showHiddenItems() { для (INT I = 0; я Astgh

+0

Обновите свой код адаптера своим последним кодом. Тогда я смогу помочь вам с этой ошибкой. –

+0

Ваш код выглядит правильно. Вы все еще получаете эту ошибку? –