2015-12-28 51 views
4

我正在顯示17個CardViews。RecyclerView適配器在錯誤的地方重複值

我正在使用RecyclerView來實現相同。

每個CardView顯示一個通用數據(格式)。

根據從JSON文件接收到的數據,卡可能會顯示一些額外的行。 enter image description here。下圖顯示了2個顯示附加數據的CardView(焦點對準),其餘顯示了常用數據。

它顯示正確。但是當我向下滾動到視圖的底部時,最後一個CardView不會顯示任何行,但它會複製上面鏈接中顯示的2中的一個。 [可以發佈僅2個鏈接時間]

然後我滾動到頂部,並將其複製從被正確地顯示兩個CardViews行和分別重複這裏頂兩張牌: enter image description here

我想什麼?

  • 如果,否則

許多類似的問題表現出一個共同的解決方案。其中一個答案就在這裏。事情是我不知道什麼條件適用和在哪裏。這是我的代碼:

@Override 
    public void onBindViewHolder(DataObjectHolder holder, final int position) { 


     HashMap<Integer, ShoppingCartSummaryObject> dataItem = new HashMap<Integer, ShoppingCartSummaryObject>(); 
     dataItem = mDataset.get(position); 

     TextView textViewComment = holder.textViewComment; 

     ShoppingCartSummaryObject obj = new ShoppingCartSummaryObject(); 
     obj = (ShoppingCartSummaryObject) dataItem.get(position); 

     holder.textViewPackageType.setText(obj.getPackageType()); 
     holder.textViewPackageCode.setText(obj.getPackageCode()); 
     holder.textViewPackageDesc.setText(obj.getPackageDesc()); 

     params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

     try { 
      for (int i = 0; i < obj.getArrayListPart().size(); i++) { 

       View view2 = LayoutInflater.from(mContext).inflate(R.layout.detailrow, null); 
       holder.advPartDesc = (TextView) view2.findViewById(R.id.advPartDesc); 
       holder.advPartnum = (TextView) view2.findViewById(R.id.advPartNum); 

       cv = holder.cv; 
       advisoryLayout = holder.advisoryLayout; 
       empty = holder.empty; 
       layoutPackageSummary = holder.layoutPackageSummary; 

       holder.detailRow = (RelativeLayout) view2.findViewById(R.id.detailRow); 

       rallyLayout = new RelativeLayout(mContext); 

       rallyLayout.addView(holder.detailRow); 

       cnt+=1; 
       rallyLayout.setId(cnt); 

       holder.layoutpartList.addView(rallyLayout); 

       if (i == 0) { //for adding the first row below standard data 

        params.addRule(RelativeLayout.BELOW, empty.getId()); 



     holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); 
       holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); 

       rallyLayout.setLayoutParams(params); 

      } else { //for more than one rows, 2nd row appearing below 1st and 3rd below 2nd and so on 

       params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
       params.addRule(RelativeLayout.BELOW, cnt - 1); 

       holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); 
       holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); 

       rallyLayout.setLayoutParams(params); 
      } 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

,這是我多努力,從共享的鏈接實現的答案:

if(obj.getArrayListPart().size()>0) { /*added the if() condition*/ 
        if (i == 0) { 

         params.addRule(RelativeLayout.BELOW, empty.getId()); 

         holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); 


      holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); 

        rallyLayout.setLayoutParams(params); 

       } else { 

        params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
        params.addRule(RelativeLayout.BELOW, cnt - 1); 

        holder.advPartnum.setText(obj.getArrayListPart().get(i).partCode); 
        holder.advPartDesc.setText(obj.getArrayListPart().get(i).partDesc); 

        rallyLayout.setLayoutParams(params); 
       } 
      } 
      else 
      { 
       holder.advPartnum.setText("abc"); 
       holder.advPartDesc.setText("abc"); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

我還補充說:

@Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 

毫無效果。

我檢查了JSON數據,從列表中刪除了一個數組,並且不管我刪除的卡是什麼,它還影響從頂部/底部行(cardviews)中刪除重複行值,具體取決於位於卡之間的卡額外的細節和卡上/下。還嘗試過:

mAdapter.setHasStableIds(true); 

但這只是略過了所有額外的行數據出現在公共標準以下。

請幫忙。我提供了我所嘗試的任何東西。

+0

http://stackoverflow.com/questions/34487921/recycler-view-not-giving-the-滾動後的正確位置 –

+0

@IntelliJAmiya:我沒有單獨使用GridView。我還應該嘗試這個鏈接嗎? P.S:[Code](http://pastie.org/10656753) –

+0

@IntelliJAmiya:我仍然無法正確理解。看來setOnClickListener()解決了他的問題。但是,我需要嗎?我不認爲我需要setOnClickListener。我將上述鏈接放在setOnClickListener()中的代碼解決了我猜測的問題。但我的情況是不同的,雖然問題似乎很相似。 –

回答

0

這是你要的XML源代碼

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/recycler_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:stackFromEnd="true" /> 

活動

import android.graphics.Color; 
import android.graphics.drawable.Drawable; 
import android.graphics.drawable.GradientDrawable; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import in.ashish29agre.calendar.R; 

public class RecyclerViewActivity extends AppCompatActivity { 

    private List<Message> messages; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_recycler_view); 
     MessagesAdapter adapter = initDefaultsAndGetADapter(); 
     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     recyclerView.setAdapter(adapter); 
    } 

    private MessagesAdapter initDefaultsAndGetADapter() { 

     GradientDrawable fromDrawable = new GradientDrawable(); 
     fromDrawable.setColor(Color.parseColor("#EC407A")); 
     fromDrawable.setCornerRadius(16f); 

     GradientDrawable toDrawable = new GradientDrawable(); 
     toDrawable.setCornerRadius(16f); 
     toDrawable.setColor(Color.parseColor("#64B5F6")); 
//  toDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); 
//  toDrawable.getPaint().setStrokeWidth(1); 


     messages = new ArrayList<>(); 
     Random random = new Random(); 
     Message message; 
     for (int i = 0; i < 20; i++) { 
      message = new Message(); 
      int value = random.nextInt(2); 
      if (value == Message.TYPE_FROM) { 
       message.setMsgType(value); 
       message.setContent("Other user says #" + i); 
       message.setDrawable(fromDrawable); 
      } else if (value == Message.TYPE_TO) { 
       message.setMsgType(value); 
       message.setContent("You are saying #" + i); 
       message.setDrawable(toDrawable); 
      } else { 
       Log.e("TAG", "Oops"); 
      } 
      messages.add(message); 
     } 
     return new MessagesAdapter(messages); 
    } 


    private class MessagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

     private List<Message> messages; 

     public MessagesAdapter(List<Message> messages) { 
      this.messages = messages; 
     } 

     @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      if (viewType == Message.TYPE_FROM) { 
       View fromLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.from_layout_item, parent, false); 
       return new OtherUserMessageHolder(fromLayout); 
      } else if (viewType == Message.TYPE_TO) { 
       View toLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.to_layout_item, parent, false); 
       return new CurrentUserMessageHolder(toLayout); 
      } else { 
       throw new IllegalArgumentException("Invalid View type"); 
      } 
     } 

     @Override 
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

      if (holder instanceof OtherUserMessageHolder) { 
       configureOtherUserMessageHolder(holder, position); 
      } else { 
       configureCurrentUserMessageHolder(holder, position); 
      } 
     } 


     private void configureCurrentUserMessageHolder(RecyclerView.ViewHolder holder, int position) { 

      if (holder != null && holder instanceof CurrentUserMessageHolder) { 
       CurrentUserMessageHolder currentUserMessageHolder = (CurrentUserMessageHolder) holder; 
       currentUserMessageHolder.getToContentTv().setText(messages.get(position).getContent()); 
       currentUserMessageHolder.getToContentTv().setBackground(messages.get(position).getDrawable()); 
      } 
     } 

     private void configureOtherUserMessageHolder(RecyclerView.ViewHolder holder, int position) { 
      if (holder != null && holder instanceof OtherUserMessageHolder) { 
       OtherUserMessageHolder otherUserMessageHolder = (OtherUserMessageHolder) holder; 
       otherUserMessageHolder.getFromContentTv().setText(messages.get(position).getContent()); 
       otherUserMessageHolder.getFromContentTv().setBackground(messages.get(position).getDrawable()); 
      } 
     } 

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

     @Override 
     public int getItemViewType(int position) { 
      return messages.get(position).getMsgType(); 
     } 

     private final class CurrentUserMessageHolder extends RecyclerView.ViewHolder { 

      private TextView toContentTv; 

      public CurrentUserMessageHolder(View itemView) { 
       super(itemView); 
       toContentTv = (TextView) itemView.findViewById(R.id.to_item_tv); 
      } 

      public TextView getToContentTv() { 
       return toContentTv; 
      } 

     } 

     private final class OtherUserMessageHolder extends RecyclerView.ViewHolder { 

      private TextView fromContentTv; 

      public OtherUserMessageHolder(View itemView) { 
       super(itemView); 
       fromContentTv = (TextView) itemView.findViewById(R.id.from_item_tv); 
      } 

      public TextView getFromContentTv() { 
       return fromContentTv; 
      } 

     } 
    } 

    private class Message { 
     private static final int TYPE_FROM = 0; 
     private static final int TYPE_TO = 1; 

     private int msgType; 
     private CharSequence content; 
     private Drawable drawable; 

     public int getMsgType() { 
      return msgType; 
     } 

     public void setMsgType(int msgType) { 
      this.msgType = msgType; 
     } 

     public CharSequence getContent() { 
      return content; 
     } 

     public void setContent(CharSequence content) { 
      this.content = content; 
     } 

     public Drawable getDrawable() { 
      return drawable; 
     } 

     public void setDrawable(Drawable drawable) { 
      this.drawable = drawable; 
     } 
    } 
} 
相關問題