2016-08-13 35 views
4

我有一個從SQL數據庫填充數據的recyclerview。現在recyclerview中的每一行都有一個搜索欄,當它移動時,它將顯示它在同一行內的文本視圖中的進度。問題是,當我向上或向下滾動recyclerview然後返回到第一個更改的行,seekbar返回到其默認位置。我怎樣才能讓它保存新的位置?在正常的活動/片段中,我使用生命週期方法作爲「onPause」來保存/恢復狀態。在這裏我們有onAttachedToRecyclerView,我認爲它應該解決我的問題,但我不知道如何。如何保存RecyclerView行項目的狀態?

編輯:這裏是一個完整的簡單的應用程序文件,我正在努力測試這個問題。

MainActivity.class

public class MainActivity extends AppCompatActivity { 
    private List<Score> scoreList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private MyAdapter mAdapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 

    mAdapter = new MyAdapter(scoreList); 
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(mAdapter); 

    prepareScoreData(); 
} 

private void prepareScoreData() { 
    Score score = new Score("title", 5); 
    scoreList.add(score); 

    for(int i= 0; i<1000; i++){ 
     score = new Score("title", 5); 
     scoreList.add(score); 
    } 

    mAdapter.notifyDataSetChanged(); 
} 
} 

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 
private List<Score> scoresList; 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView title, scoreView; 
    SeekBar seekbar; 

    public MyViewHolder(View view) { 
     super(view); 
     title = (TextView) view.findViewById(R.id.title); 
     scoreView = (TextView) view.findViewById(R.id.score); 
     seekbar = (SeekBar) view.findViewById(R.id.seekbar); 
    } 
} 


public MyAdapter(List<Score> scoresList) { 
    this.scoresList = scoresList; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item, parent, false); 

    return new MyViewHolder(itemView); 
} 


@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    final Score score = scoresList.get(position); 
    holder.title.setText(score.getTitle()); 

    if (!score.getProgressed()) { 
     holder.seekbar.setProgress(0) ; 
    } else { 
     holder.seekbar.setProgress(score.getSeekbarProgress()); 
    } 

    holder.seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      holder.scoreView.setText(String.valueOf(i)); 
      score.setSeekbarProgress(i); 
      score.setProgressed(true); 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 
    }); 
} 

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

分數類

public class Score { 
private String title; 
int seekbarProgress; 
boolean progressed; 

public Score() { 
} 

public Score(String title,int seekbarProgress) { 
    this.title = title; 
    this.seekbarProgress = seekbarProgress; 
} 

public void setProgressed(boolean progressed) { 
    this.progressed = progressed; 
} 



public void setTitle(String title) { 
    this.title = title; 
} 

public void setSeekbarProgress(int seekbarProgress) { 
    this.seekbarProgress = seekbarProgress; 
} 

public String getTitle() { 
    return title; 
} 

public int getSeekbarProgress() { 
    return seekbarProgress; 
} 

public boolean getProgressed() { 
    return progressed; 
} 
} 

MainActivity_Layout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.moaness.tut_recyclerview.MainActivity"> 

    <!-- A RecyclerView with some commonly used attributes --> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/my_recycler_view" 
     android:scrollbars="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
    </RelativeLayout> 

item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:focusable="true" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="60dp" 
    android:paddingBottom="60dp" 
    android:layout_marginBottom="10dp" 
    android:clickable="true" 
    android:background="#f2f2f2" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/title" 
     android:text="title" 
     android:textColor="@color/title" 
     android:textSize="16dp" 
     android:paddingTop="16dp" 
     android:textStyle="bold" 
     android:layout_alignParentTop="true" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/score" 
     android:text="score" 
     android:layout_below="@+id/title" 
     android:textSize="16dp" 
     android:paddingBottom="16dp" 
     android:textStyle="bold" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <SeekBar 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/score" 
     android:id="@+id/seekbar" 
     /> 

</RelativeLayout> 
+0

每當行的視圖熄滅然後回到視圖中,它將從您提供的任何方法/數據中重新填充它。您需要將您的seekbar數據保存到本地的SQL數據庫中,然後將這些邏輯包含在您填充行的方式中。 – TWL

+0

我不能相信這種硬編碼風格是這裏唯一的方法:(必須有一個更簡單的方法來處理這樣的小數據變化 – Bialy

+0

爲我們提供代碼片段以更好地理解您的查詢! – Smit

回答

10

如果您正在使用recyclerview你需要保持每行的狀態,也就是說,如果你正在使用的條件(即檢查。如果)在recyclerview項目的任何階段(在recyclerview適配器類中),那麼您還需要處理其他問題。我可以給你發一個代碼片段,以便你可以有一個適合recyclerview適配器的好主意。

public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> { 
    List<ViewHolder> holders = new ArrayList<ViewHolder>(); 
    private ArrayList<ContactModel> arrayList = new ArrayList<>(); 
    private Context context; 
    private LayoutInflater inflater; 

    public void clearAdapter() { 
     arrayList.clear(); 
     notifyDataSetChanged(); 
    } 

    public ContactsAdapter(Context context, ArrayList<ContactModel> arrayList) { 
     this.context = context; 
     this.arrayList = arrayList; 
    } 

    public void setList(ArrayList<ContactModel> listSearch) { 
     this.arrayList = listSearch; 
     notifyItemRangeChanged(0, listSearch.size()); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    inflater = LayoutInflater.from(parent.getContext()); 
     View view = inflater.inflate(R.layout.custom_row_for_contacts, parent, false); 
     ViewHolder viewHolder = new ViewHolder(view); 
     holders.add(viewHolder); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     final ContactModel current = this.arrayList.get(position); 
     holder.txtDriverName.setText(current.getName()); 
     holder.txtDriverPhone.setText(current.getPhone()); 
     if (current.getImgUrl().length() > 0) { 
      String urlLicenceThumb = UrlEndPoints.parentUrl + current.getImgUrl(); 
      Glide.with(context).load(urlLicenceThumb).error(R.mipmap.ic_launcher).into(holder.imgDriver); 
     } else { 
      Glide.with(context).load(R.mipmap.ic_launcher).into(holder.imgDriver); 
     } 
    } 

    public void delete(int position) { 
     arrayList.remove(position); 
     notifyItemRemoved(position); 
    } 

    @Override 
    public int getItemCount() { 
     return (null != arrayList ? arrayList.size() : 0); 
    } 

    class ViewHolder extends RecyclerView.ViewHolder { 
     private TextView txtDriverName, txtDriverPhone; 
     private CircleImageView imgDriver; 
     private Button btnInvite; 
     private CheckBox chkAdd; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      chkAdd = (CheckBox) itemView.findViewById(R.id.chkAdd); 
      imgDriver = (CircleImageView) itemView.findViewById(R.id.imgDriver); 
      txtDriverName = (TextView)itemView.findViewById(R.id.txtDriverName); 
      txtDriverPhone = (TextView)  itemView.findViewById(R.id.txtDriverPhone); 
      btnInvite = (Button) itemView.findViewById(R.id.btnInvite); 
     } 
    } 
} 
+0

是的請,代碼片段會很多謝謝 – Bialy

+0

我已經在這裏更新了代碼片段... – Maddy

+0

謝謝,但我真的不明白if/else語句會如何保存狀態?假設你有一個複選框,我保存列表滾動後的選中/未選中狀態 – Bialy