2014-11-30 4 views
1

Из моей активности У меня есть список данных, которые я передаю в адаптер RecyclerView. Адаптер берет список данных и манипулирует во время взаимодействия с пользователем.Доступ к набору данных в адаптере RecyclerView из активности

Теперь я хочу получить доступ к набору данных в адаптере для использования в моей деятельности, так что, когда пользователь поворачивает свое устройство или по какой-либо другой причине действие уничтожается и воссоздается, набор данных из адаптера может быть сохранен в и затем передается обратно в адаптер, когда активность создается снова.

Как это возможно? Адаптер RecyclerView не имеет методов для получения элементов из набора данных, например, обычного адаптера.

Мой адаптер Код:

public class MyCustomAdapter extends RecyclerView.Adapter<MyCustomAdapter.ViewHolder> implements View.OnClickListener, 
    EditText.OnEditorActionListener { 

private ArrayList<Task> mDataset; 
private static Context sContext; 

// Adapter's Constructor 
public MyCustomAdapter(Context context, ArrayList<Task> myDataset) { 
    mDataset = myDataset; 
    sContext = context; 
} 

// Create new views. This is invoked by the layout manager. 
@Override 
public MyCustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // Create a new view by inflating the item_row.xml 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_row, parent, false); 

    // Set the view to the ViewHolder 
    ViewHolder holder = new ViewHolder(v); 
    holder.myCheckBox.setOnClickListener(MyCustomAdapter.this); 
    holder.myItem.setOnEditorActionListener(MyCustomAdapter.this); 

    holder.myRow.setTag(holder); 
    holder.myCheckBox.setTag(holder); 
    holder.myItem.setTag(holder); 

    return holder; 
} 

// Replace the contents of a view. This is invoked by the layout manager. 
@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 

    Task task = mDataset.get(position); 
    holder.myItem.setText(task.getName()); 
    if (task.isCompleted()) { 
     holder.myCheckBox.setChecked(true); 
     holder.myItem.setPaintFlags(holder.myItem.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
     holder.myItem.setTextColor(Color.parseColor("#8C000000")); 
    } 
    else { 
     holder.myCheckBox.setChecked(false); 
     holder.myItem.setPaintFlags(holder.myItem.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG)); 
     holder.myItem.setTextColor(Color.parseColor("#E6000000")); 
    } 
} 

// Return the size of your dataset (invoked by the layout manager) 
@Override 
public int getItemCount() { 
    return mDataset.size(); 
} 

// Implement OnClick listener. 
@Override 
public void onClick(View view) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 

    if (holder.myCheckBox.isChecked()) { 
     Task task = mDataset.get(holder.getPosition()); 
     task.setCompleted(true); 
     mDataset.set(holder.getPosition(), task); 
    } 
    else { 
     Task task = mDataset.get(holder.getPosition()); 
     task.setCompleted(false); 
     mDataset.set(holder.getPosition(), task); 
    } 

    notifyDataSetChanged(); 
} 

@Override 
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_DONE) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 

      if (view.getText().length() != 0) { 
       Task task = mDataset.get(holder.getPosition()); 
       task.setName(view.getText().toString()); 
       mDataset.set(holder.getPosition(), task); 

       notifyDataSetChanged(); 
      } else { 
       view.setText(""); 
      } 

      return true; 
    } 
    return false; 
} 

// Create the ViewHolder class to keep references to your views 
public static class ViewHolder extends RecyclerView.ViewHolder { 
    public LinearLayout myRow; 
    public CheckBox myCheckBox; 
    public EditText myItem; 

    /** 
    * Constructor 
    * @param v The container view which holds the elements from the item_row.xml 
    */ 
    public ViewHolder(View v) { 
     super(v); 

     myRow = (LinearLayout) v.findViewById(R.id.item_row); 
     myCheckBox = (CheckBox) v.findViewById(R.id.myCheckBox); 
     myItem = (EditText) v.findViewById(R.id.myItem); 
    } 
} 

}

+0

Вы можете создать адаптер cutom и добавить методы get() и set() к своим данным. – Rami

+0

. Мой текущий адаптер уже является настраиваемым адаптером. Итак, вы говорите, что мне нужно установить его как абстрактный, а затем создать новый адаптер, который расширяет его? – user2844485

+0

Нет. Разместите свой код адаптера, я скажу вам, что вы должны делать – Rami

ответ

2

Попробуйте это:

public class MyCustomAdapter extends RecyclerView.Adapter<MyCustomAdapter.ViewHolder> implements View.OnClickListener, 
    EditText.OnEditorActionListener { 

private ArrayList<Task> mDataset; 
private static Context sContext; 

// Adapter's Constructor 
public MyCustomAdapter(Context context, ArrayList<Task> myDataset) { 
    mDataset = myDataset; 
    sContext = context; 
} 

public ArrayList<Task> getDataSet(){ 
return mDataset; 
} 

public void setDataSet(ArrayList<Task> newDataSet){ 
this.mDataset = newDataSet; 
notifyDataSetChanged(); 
} 


// Create new views. This is invoked by the layout manager. 
@Override 
public MyCustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // Create a new view by inflating the item_row.xml 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_row, parent, false); 

    // Set the view to the ViewHolder 
    ViewHolder holder = new ViewHolder(v); 
    holder.myCheckBox.setOnClickListener(MyCustomAdapter.this); 
    holder.myItem.setOnEditorActionListener(MyCustomAdapter.this); 

    holder.myRow.setTag(holder); 
    holder.myCheckBox.setTag(holder); 
    holder.myItem.setTag(holder); 

    return holder; 
} 

// Replace the contents of a view. This is invoked by the layout manager. 
@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 

    Task task = mDataset.get(position); 
    holder.myItem.setText(task.getName()); 
    if (task.isCompleted()) { 
     holder.myCheckBox.setChecked(true); 
     holder.myItem.setPaintFlags(holder.myItem.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
     holder.myItem.setTextColor(Color.parseColor("#8C000000")); 
    } 
    else { 
     holder.myCheckBox.setChecked(false); 
     holder.myItem.setPaintFlags(holder.myItem.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG)); 
     holder.myItem.setTextColor(Color.parseColor("#E6000000")); 
    } 
} 

// Return the size of your dataset (invoked by the layout manager) 
@Override 
public int getItemCount() { 
    return mDataset.size(); 
} 

// Implement OnClick listener. 
@Override 
public void onClick(View view) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 

    if (holder.myCheckBox.isChecked()) { 
     Task task = mDataset.get(holder.getPosition()); 
     task.setCompleted(true); 
     mDataset.set(holder.getPosition(), task); 
    } 
    else { 
     Task task = mDataset.get(holder.getPosition()); 
     task.setCompleted(false); 
     mDataset.set(holder.getPosition(), task); 
    } 

    notifyDataSetChanged(); 
} 

@Override 
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_DONE) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 

      if (view.getText().length() != 0) { 
       Task task = mDataset.get(holder.getPosition()); 
       task.setName(view.getText().toString()); 
       mDataset.set(holder.getPosition(), task); 

       notifyDataSetChanged(); 
      } else { 
       view.setText(""); 
      } 

      return true; 
    } 
    return false; 
} 

// Create the ViewHolder class to keep references to your views 
public static class ViewHolder extends RecyclerView.ViewHolder { 
    public LinearLayout myRow; 
    public CheckBox myCheckBox; 
    public EditText myItem; 

    /** 
    * Constructor 
    * @param v The container view which holds the elements from the item_row.xml 
    */ 
    public ViewHolder(View v) { 
     super(v); 

     myRow = (LinearLayout) v.findViewById(R.id.item_row); 
     myCheckBox = (CheckBox) v.findViewById(R.id.myCheckBox); 
     myItem = (EditText) v.findViewById(R.id.myItem); 
    } 
} 

От вашей деятельности вы можете использовать их как это:

yourAdapter.getDataSet(); // return your adapter data 
yourAdapter.setDataSet(newData); // change your adapter data 
+0

Я уже пробовал это. Проблема, которую я получаю, заключается в том, что в моей работе, когда я набираю yourAdapter.getDataSet(), Android Studio выдает сообщение об ошибке «Невозможно разрешить метод getDataSet()». – user2844485

+0

Вы уверены, что * yourAdapter * является экземпляром MyCustomAdapter? – Rami

+0

Да. Вот как это выглядит в моей деятельности. 'RecyclerView.Adapter adapter = новый MyCustomAdapter (MyActivity.this, listOfData); recyclerView.setAdapter (адаптер); ArrayList testList = adapter.getDataSet(); // не может решить метод' – user2844485

1

Ответ Рами является почти corr и все, что ему нужно сделать. Чтобы получить доступ к методу, вам необходимо указать экземпляр адаптера для вашего адаптера. Это то, что вы можете сделать в вашей деятельности:

((MyCustomAdapter)mAdapter).setDataSet(newData); 

Если mAdapter это экземпляр, который вы создали в своей деятельности и setDataSet является публичной функцией класса MyCustomAdapter.

Cheers!

Смежные вопросы