以编程方式在recyclerview onbindView适配器中添加textview

时间:2016-10-25 12:37:03

标签: android android-recyclerview

即使数组RecyclerView中的数据没有更改,滚动TextView logtime.get(i).getTime()内的数据也会发生更改。仅当我们将数据放入正在生成的textview中时才会更改动态。

public void onBindViewHolder(PunchCardViewHolder holder, int position) {

    PunchCardReport punchCardReport = punchCardReports.get(position);
    holder.sNumber.setText(punchCardReport.getmSNumber());
    holder.logDate.setText(punchCardReport.getmLogDate());
    StringTokenizer stringTokenizer = new StringTokenizer(punchCardReport.getmLogTime(), ",");
    List<LogTime> logtime = punchCardReport.getmLogTimeList();
    for (int i = 0; i < logtime.size(); i++) {
        Log.d(TAG, "onBindViewHolder: "+logtime.get(i).getTime());

    }
    LinearLayout.LayoutParams dim = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
     for (int i = 0; i < logtime.size(); i++) {

         TextView textView=new TextView(mContext);
         textView.setLayoutParams(dim);
         textView.setText(logtime.get(i).getTime());//the problem is here when we put data inside textview
         holder.logTime.addView(textView);
    }

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

4 个答案:

答案 0 :(得分:2)

你的设计完全错了。您在每次调用TextView时都会创建新的onBindViewHolder(),这意味着当您滚动回到视图时,会创建一个新的TextView列表,所以现在你有两组TextView一个来自最后一个电话,一个来自现在(继续滚动,还会有更多额外的TextViews。)

应在onCreateViewHolder()中创建新视图。您获得此行为的原因可能是RecyclerView使用Scrapped Views,这意味着它会重复使用之前创建的View。从而提高性能(因为不需要新的内存分配)。如果您正在寻找嵌套RecyclerView,请改为使用。

答案 1 :(得分:1)

您可以在onBindViewHolder中添加以下代码。

if(holder.logTime.getChildCount()>0){
    holder.logTime.removeAllViews();
}

for (int i = 0; i < logtime.size(); i++) {

    TextView textView=new TextView(mContext);
    textView.setLayoutParams(dim);
    textView.setText(logtime.get(i).getTime());
    //the problem is here when we put data inside textview
    holder.logTime.addView(textView);
}

答案 2 :(得分:0)

尝试将此行放在onbindViewHolder的开头。

holder.setIsRecyclable(假);

或者,您可以将TextView放在XML文件中。无需在Onbinder中创建动态文本视图。

答案 3 :(得分:0)

您只需添加holder.setIsRecyclable(false);适配器中的onBindViewHolder内部方法