2017-11-19 11 views
0

これはちょっと混乱しているかもしれませんが、そこにハングアップして、説明のためにコメントを残してください。私はアダプタ内でRecyclerViewを使用しています。これは、ListView内で水平方向にスクロールできる複数の行が必要なためです。行数は完全に問題ありませんが、各行の項目数は間違っています。最初の行には正しい行数が表示されますが、それ以降の行には1行しか必要ないときに各行に複数の項目が表示されます。呼び出すアダプタ内でRecyclerViewを使用する

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; 

    } 
} 

私の最初のアダプタ:1行目を表示1つのアイテム(これは私が欲しいものである)、行2ディスプレイ2つの項目、行3を表示3つのアイテムなどこれは最初のアダプタを呼び出して、私のフラグメント・ファイルでありますリサイクルのadapater:

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(); 
} 

それが広告である理由として任意のヘルプ複数の項目を丁寧に評価することができます。

EDIT: featuredAdapterの中のgetViewメソッドの冒頭にあるリストを消去してこの問題を解決しました。ただし、次のようなエラーが表示されます。

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

これは突然起こっているのですか?

+1

新しいrecycler_adapterを初期化してfeatured_postListを引数として渡すと、何か問題があるようです。その後、別のpostListを追加すると、次回はgetViewが呼び出されるため、featured_postListは前のリスト項目よりも1つ多くの要素を持つことになります – Vigen

+0

スクロールhorizo​​nal [nested-recycler-view](https:///github.com/msahakyan/nested-recycler-view)。私はこのアダプターを自分で使いました。それは役に立ちました。 – Erik

+0

@Vigen私は、recyclerVIewをブレークポイントでよりよくデバッグし、どこが間違っているのかを見てみたいです。メソッドが呼び出される回数を決して知りません。 –

答えて

0

私は最終的に私の問題を解決する方法を考え出しました。まず、それが複数回同じ要素を入れていないことを確認するために、私はfeaturedAdapaterでGetViewメソッドの内部でリストをクリアするためのステートメントを追加:次に

featured_postList.clear(); 

、私は理由はIndexOutOfBoundsExceptionを得ましたメソッドの始めに明確なステートメントがありました。代わりに、私は文をif(convertView == null)ステートメントの中に入れて解決しました。これは私の問題を解決し、今は意図したとおりに動作します。

関連する問題