代码之家  ›  专栏  ›  技术社区  ›  Matthew Vanlandingham

在适配器内部使用RecyclerView

  •  0
  • Matthew Vanlandingham  · 技术社区  · 8 年前

    public class featured_fragment extends android.support.v4.app.Fragment {
    
        public  ArrayList<featured_post> featured_post_list = new ArrayList<>();
        private RecyclerView recyclerView;
    
        public featured_fragment() {
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
    
    
            View view = inflater.inflate(R.layout.featured_activity, container, false);
            ListView listView = view.findViewById(R.id.featured_list);
            featuredAdapter adapter = new featuredAdapter(getContext(),featured_post_list);
            listView.setAdapter(adapter);
    
            //Row 1
            featured_post post = new featured_post();
            adapter.add(post);
    
            //Row 2
            featured_post post1 = new featured_post();
            adapter.add(post1);
    
            //Row 3
            featured_post post2 = new featured_post();
            adapter.add(post2);
    
            return view;
    
        }
    }
    

    public class featuredAdapter extends ArrayAdapter<featured_post>{
    
    private List<featured_post> featured_postList = new ArrayList<>();
    private RecyclerView recyclerView;
    private recycler_adapter adapter;
    private Context context;
    
    
    
    public featuredAdapter(Context context, ArrayList<featured_post> users){
    
        super(context,0,users);
        this.context=context;
    
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
    
    
        featured_post post_item = getItem(position);
    
        if(convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.featured_fragment_activity, parent, false);
    
    
        recyclerView = convertView.findViewById(R.id.featured_recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
    
        adapter = new recycler_adapter(context,featured_postList);
        recyclerView.setAdapter(adapter);
    
        featured_post post = new featured_post(Integer.toString(position));
    
        featured_postList.add(post);
        }
      return convertView
      }
    }
    

    然后,最后一个适配器名为 recycler_adapter (请原谅这个适配器,我在创建它时非常困惑):

    public class recycler_adapter extends RecyclerView.Adapter<recycler_adapter.MyViewHolder> {
    private List<featured_post> featuredList;
    private Context context;
    
    public class MyViewHolder extends RecyclerView.ViewHolder {
    
        public TextView text;
        public MyViewHolder(View view) {
    
            super(view);
            this.text = view.findViewById(R.id.my_text);
    
        }
    }
    
    public recycler_adapter(Context context,List<featured_post> featuredList) {
        this.featuredList = featuredList;
        this.context = context;
    
    }
    
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
        View itemView = LayoutInflater.from(context).inflate(R.layout.recycler_activity,null);
        MyViewHolder viewHolder = new MyViewHolder(itemView);
    
        return viewHolder;
    }
    
    @Override
    public void onBindViewHolder(MyViewHolder holder,int position) {
    
        featured_post featured_post = featuredList.get(position);
        holder.text.setText(featured_post.string);
    }
    
    @Override
    public int getItemCount() {
        return featuredList.size();
    }
    

    如果您能帮我解释为什么要添加多个项目,我们将不胜感激。

    编辑: 我通过在开始时清除列表解决了这个问题 getView 方法内部的 featuredAdapter . 然而,我得到一个错误,说:

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:4
    

    你知道为什么这一切会突然发生吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Matthew Vanlandingham    8 年前

    我终于想出了解决问题的办法。首先,为了确保不会多次放置同一个元素,我添加了一条语句来清除FeaturedAdapter中getView方法内的列表:

    featured_postList.clear();
    

    然后,我得到了一个IndexOutOfBoundsException,因为clear语句位于方法的开头。相反,我通过将声明放入 if(convertView == null) 陈述这解决了我的问题,现在它按预期工作。