2017-11-19 2 views
0

다소 혼란 스럽지만 거기에 매달려 설명을 위해 의견을 남기십시오. 어댑터 내에서 RecyclerView를 사용하고 있습니다. 이것은 ListView에서 가로로 스크롤 할 수있는 여러 행이 필요하기 때문입니다. 행 수는 완벽하지만 각 행의 항목 수가 잘못되었습니다. 첫 번째 행에는 정확한 행 수가 표시되지만 그 다음 행에는 하나만 필요할 때 각 행에 여러 항목이 표시됩니다. 행 1 개 표시 한 항목 (이 내가 원하는 것입니다), 2 개 행 표시 2 개 항목, 행 3 개 디스플레이 3 개 항목 등이 첫 번째 어댑터 호출 내 조각 파일입니다어댑터 내부에서 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; 

    } 
} 

내 첫 어댑터를 호출 이 광고 인 이유에

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

어떤 도움을 : 리사이클 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라는 이름의 (을 만들 때이 어댑터를 용서하십시오, 나는 매우 혼란스러워했다) 여러 항목을 땡땡이 크게 감사 할 것입니다.

편집 : featuredAdapter 내부의 getView 메서드 시작 부분에있는 목록을 지워서이 문제를 해결했습니다. 그러나 다음과 같은 오류가 표시됩니다.

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

왜 갑자기 이런 일이 발생하는지 알고 싶습니다.

+1

새로운 recycler_adapter를 초기화하고 featured_postList를 인수로 전달할 때 잘못된 것으로 보입니다. 그런 다음 또 다른 postList를 추가하면 다음 번에 getView가 호출 될 때 논리적인데, featured_postList는 이전 목록 항목보다 하나 더 많은 요소를 갖습니다. – Vigen

+0

scroll horizonal [nested-recycler-view] (https :// /github.com/msahakyan/nested-recycler-view). 이 어댑터를 직접 사용했고 유용했습니다. – Erik

+0

@Vigen breakpoint를 사용하여 recyclerVIew를 디버그하고 잘못되는 부분을 볼 수는 있지만 무작위로 동작 할 수 있기를 바랍니다. 메서드를 호출 할 횟수를 절대 알지 못합니다. –

답변

0

나는 마침내 내 문제를 해결하는 방법을 알아 냈습니다. 첫째, 두 번 이상 같은 요소를 넣지 않는 것을 확인하기 위해, 나는 featuredAdapater에서의 getView 방법의 내부 목록을 지우려면 성명을 추가 : 다음

featured_postList.clear(); 

, 나는 때문에 IndexOutOfBoundsException이있어 명확한 진술은 방법의 시작에 있었다. 대신, 나는 성명서를 if(convertView == null) 성명서 안에 넣음으로써 그것을 해결했다. 이게 내 문제를 해결하고 이제 의도 한대로 작동합니다.

관련 문제