RecyclerView问题加载了n个以上的项目

时间:2018-09-28 15:28:02

标签: java android android-recyclerview

我已经实现了一个RecyclerView,如下所示

带支架的适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.indovinelloelement,parent,false);

        MyHolder holder = new MyHolder(view);
        return holder;
    }


    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, int position) {
        holder.category.setText(data.get(position).getCategory());
        holder.difficulty.setText(""+data.get(position).getDifficulty());
        holder.title.setText(data.get(position).getTitle());
        holder.score.setText(""+data.get(position).getScore());
        if(data.get(position).isLocked())
            holder.setLocked();
        else
            holder.setUnlocked();

    }


    public DataGestour.Indovinello getIndovinello(int pos){
        return data.get(pos);
    }


    @Override
    public int getItemCount() {
        return data.size();
    }


    public class MyHolder extends RecyclerView.ViewHolder {

        public TextView category,score,difficulty,title;

        private ImageView lock_state;

        public MyHolder(View itemView) {
            super(itemView);
            category = (TextView)itemView.findViewById(R.id.categoria);
            score = (TextView)itemView.findViewById(R.id.punteggio);
            difficulty = (TextView) itemView.findViewById(R.id.difficolta);
            title = (TextView)itemView.findViewById(R.id.titolo);

            lock_state = (ImageView) itemView.findViewById(R.id.lock_state);
        }

        public void setLocked(){
            lock_state.setImageResource(R.drawable.ic_lock_outline_black_24dp);
        }

        public void setUnlocked(){
            lock_state.setImageResource(R.drawable.ic_lock_open_black_24dp);
        }
    }



    ArrayList<DataGestour.Indovinello> data;
    Context context;
    public MyAdapter(Context context, ArrayList<DataGestour.Indovinello> list){
        this.context = context;
        this.data = list;
    }
}

和RecyclerView:

rc = (RecyclerView)root_view.findViewById(R.id.lista_domande);
    rc.setHasFixedSize(true);

LinearLayoutManager ly = new LinearLayoutManager(getContext());
ly.setOrientation(LinearLayoutManager.VERTICAL);

rc.setLayoutManager(ly);

try{
    gestour = new DataGestour(getContext());
}catch (IllegalStateException e){
    Log.e("DataManager",e.getMessage());
};

adapter = new MyAdapter(getContext(),gestour.getAllDatas());

rc.setAdapter(adapter);
adapter.notifyDataSetChanged();

其中,DataGestoure是一个类,用于处理来自 数据库并将它们存储在ArrayList中(DataGestour.getAllDatas是在ArrayList下返回数据的方法)

仅当ArrayList包含3个以上的项目时,问题才开始出现,因为尽管适配器将所有数据保存在ArrayList data中,但RecyclerView并未显示它们

1 个答案:

答案 0 :(得分:1)

那么,您的代码需要更多顺序,因为它的结构不正确,默认情况下,RecyclerView具有其Scrolleable视图,除非在XML中删除了此属性,那么我建议您在适配器中使用此代码并使用一个模型来保存从BD获得的信息,这是使所有事物井井有条的正确方法,并且操作起来更容易,一旦完成,您就可以完美地使用此代码,我相信它将可以正常工作,请记住仅将信息传递给我的模型(在我的情况下称为“模型”),这样就可以解决数据加载错误。在这些情况下,也建议使用List <>,因为操作数据时Arrays <>容易出错,如果您以呈现代码的方式进行操作,则会出错。

private List<Model> mDataList;

public MyAdapter(Context context){
        this.context = context;
        this.mDataList = new ArrayList<>();
    }

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.indovinelloelement,parent,false);

    return new MyHolder(view);
}


@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
    MyHolder holder = (MyHolder) MyHolder;
    hoder.bind(mDataList.getPosition(position));
}

@Override
public int getItemCount() {
    return mDataList.size();
}

 public void setData(List<Model> list) {
    mDataList.clear();
    mDataList.addAll(list);
    notifyDataSetChanged();
}


public class MyHolder extends RecyclerView.ViewHolder {

    TextView category;
    category = (TextView)itemView.findViewById(R.id.categoria);
    TextView score;
    score = (TextView)itemView.findViewById(R.id.punteggio);
    TextView difficulty;
    difficulty = (TextView) itemView.findViewById(R.id.difficolta);
    TextView title;
    title = (TextView)itemView.findViewById(R.id.titolo);
    ImageView lock_state;
    lock_state = (ImageView) itemView.findViewById(R.id.lock_state);

    public MyHolder(View itemView) {
        super(itemView);
    }

    protected void bind(Model model){
        category.setText(model.getCategory());
        score.setText(model.getScore());
        difficulty.setText(model.getDifficulty());
        title.setText(model.getTitle());

        if(model.isLocked()){
            lock_state.setImageResource(R.drawable.ic_lock_outline_black_24dp);
        } else {
            lock_state.setImageResource(R.drawable.ic_lock_open_black_24dp);
        }
    }
}
}

对于包含RecyclerView的类,请使用以下代码。

RecyclerView mRecyclerView;
mRecyclerView = (RecyclerView)root_view.findViewById(R.id.lista_domande);

private MyAdapter mAdapter;
private List<Model> mDataList;
private DataGestour gestour;

private void setupRecyclerView(){

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(linearLayoutManager);

mAdapter = new MyAdapter(getContext());
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setData(mDataList);

}

private void getDataDB(){
    mDataList.add(gestour.getAllDatas);
}