在RecyclerView项目上单击更改DataSet

时间:2015-06-19 17:57:45

标签: android android-recyclerview

我正在开发一个项目,我需要在单击recyclelerView项目后更改recyclelerView的数据。我在onBindViewHolder方法中尝试了setOnClickListener:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<Dataset> mDataset = Collections.emptyList();
    private static Context sContext;
    private SharedPreferences sharedPrefs;

    // Create new views (invoked by layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = null;

        sharedPrefs = Functions.getShPreferences(parent.getContext(), "selected_view");
        viewType = sharedPrefs.getInt("selected_view", 0);
        switch (viewType) {
            case 0:
                v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_view, parent, false);
                break;
            case 1:
                v = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_view, parent, false);
                break;
        }

        // set the view's size, margins, paddings and layout parameters

        return new ViewHolder(v);
    }

    // Replace the contents of a view (invoked by layout manager)
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        final Dataset current = mDataset.get(position);

        holder.mName.setText(current.getName());
        holder.mIcon.setImageResource(current.getIconId());
        holder.mLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // make your click listener here
                String f = Functions.getRoot(current.getFile());

                mDataset = Functions.getData(f);
                new FileAdapter(sContext, f);
                notifyDataSetChanged();
                Toast.makeText(v.getContext(), f, Toast.LENGTH_SHORT).show();
            }
        });

    }

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

    @Override
    public int getItemViewType(int position) {

        return super.getItemViewType(position);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView mName;
        ImageView mIcon;
        RelativeLayout mLayout;
        //TextView mFileDateModified;

        public ViewHolder(View v) {
            super(v);
            mLayout = (RelativeLayout) v.findViewById(R.id.recycler_view_layout);
            mName = (TextView) v.findViewById(R.id.file_name);
            mIcon = (ImageView) v.findViewById(R.id.file_icon);


        }
    }

    public MyAdapter(Context context, String ph) {
        context = sContext;
        mDataset = Functions.getData(ph);
    }
}

我已将此代码放在onBindViewHolder中。但它不起作用。任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:3)

您可以在ViewHolder内部类中设置侦听器。代码就像;

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public ViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mDataset = Functions.getData();
        new FileAdapter();
        notifyDataSetChanged();

        int position = getAdapterPosition();
        // or
        position = getLayoutPosition();
        // both worked for me
    }
}

答案 1 :(得分:0)

我认为打电话给notifyDataSetChanged();  不是一个好主意,因为如果有长数据,它会更改并刷新所有可能让您遇到麻烦的数据,因此建议使用

notifyItemChanged(getAdapterPosition());

我的ViewHolder看起来像这样:

public class AttendanceListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView rollNo, name,isPresent;


    public AttendanceListViewHolder(View itemView) {
        super(itemView);
        if (isRecyclerViewClickable) {
            isPreset.setOnClickListener(this);
        }

    }

    @Override
    public void onClick(View v) {



        data.get(getAdapterPosition()).wasPresent = "false";


        notifyItemChanged(getAdapterPosition());
    }
}