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

잘라 내기 어댑터를 만들고 데이터에 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 = new MyCustomAdapter (MyActivity.this, listOfData); recyclerView.setAdapter (adapter); ArrayList testList = adapter.getDataSet(); // 메소드를 해결할 수 없습니다' – user2844485

1

라미의 대답은 거의 코르 요, 그가 던져 넣어야 할 모든 것. 메서드에 액세스하려면 어댑터의 인스턴스를 어댑터로 캐스팅해야합니다.

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

을 mAdapter 당신이 당신의 활동에 생성 된 인스턴스이며, setDataSet는 MyCustomAdapter 클래스의 공공 기능의 경우 : 이것은 당신의 활동에서 할 수있는 것입니다.

건배!

관련 문제