从活动中访问RecyclerView适配器中的数据集

时间:2014-11-30 17:19:07

标签: android

从我的活动中我有一个数据列表,我将其传递给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);
    }
}

}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

拉米的答案几乎是正确的,他需要施展。 您需要将适配器的实例强制转换为适配器才能访问该方法。这是您在活动中可以做的事情:

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

如果mAdapter是您在活动中创建的实例,则setDataSet是MyCustomAdapter类的公共函数。

干杯!