1

AsyncListUtil을 사용하여 백그라운드에서 데이터베이스의 항목을로드합니다.AsyncListUtil은 새로 고침 후 오래된 데이터를 유지합니다.

타일 크기가 50 인 경우 AsyncListUtil은 refresh() 이후에 캐시를 지우지 않습니다. 재활용보기는 이전 목록의 상위 6 개 항목을 표시하지만 마지막 6 개 항목을 표시해야합니다. 타일 ​​크기가 5 일 때 괜찮습니다.

타일 크기에 제한이 있습니까? 아니면 내 코드에 문제가 있습니까?

다음은 동일한 문제가있는 예제 코드입니다.

public class AsyncListUtilActivity extends AppCompatActivity { 
    private static final String TAG = "AsyncListUtilActivity"; 
    private RecyclerView mRecyclerView; 
    private LinearLayoutManager mLinearLayoutManager; 
    private List<String> textList = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mRecyclerView = new RecyclerView(this); 
     mLinearLayoutManager = new LinearLayoutManager(this); 
     textList.addAll(Arrays.asList(Cheeses.sCheeseStrings)); 
     mRecyclerView.setLayoutManager(mLinearLayoutManager); 
     mRecyclerView.setHasFixedSize(true); 
     final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     mRecyclerView.setLayoutParams(layoutParams); 
     mRecyclerView.setAdapter(new AsyncAdapter(textList)); 
     setContentView(mRecyclerView); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
     return true; 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     List<String> tmpList = new ArrayList<>(6); 
     for(int i = textList.size() - 1; i >= textList.size() - 6 ; --i) { 
      tmpList.add(textList.get(i)); 
     } 
     textList.clear(); 
     textList.addAll(tmpList); 
     ((AsyncAdapter) mRecyclerView.getAdapter()).refresh(); 
     return super.onOptionsItemSelected(item); 
    } 
    private static class TextViewHolder extends RecyclerView.ViewHolder { 
     TextView textView; 
     public TextViewHolder(Context context) { 
      super(new TextView(context)); 
      textView = (TextView) itemView; 
     } 
    } 
    private class AsyncAdapter extends RecyclerView.Adapter<TextViewHolder> { 
     private AsyncListUtil<String> mAsyncListUtil; 
     AsyncAdapter(final List<String> textList) { 
      mAsyncListUtil = new AsyncStringListUtil(textList); 
     } 
     @Override 
     public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      return new TextViewHolder(parent.getContext()); 
     } 
     @Override 
     public void onBindViewHolder(TextViewHolder holder, int position) { 
      final String itemString = mAsyncListUtil.getItem(position); 
      if (itemString == null) { 
       holder.textView.setText("loading..."); 
      } else { 
       holder.textView.setText(itemString); 
      } 
     } 
     @Override 
     public int getItemCount() { 
      return mAsyncListUtil.getItemCount(); 
     } 

     public void refresh() { 
      mAsyncListUtil.refresh(); 
     } 
    } 
    private class AsyncStringListUtil extends AsyncListUtil<String> { 
     private static final int TILE_SIZE = 50; 
     private static final long DELAY_MS = 500; 
     public AsyncStringListUtil(final List<String> textList) { 
      super(String.class, TILE_SIZE, 
        new AsyncListUtil.DataCallback<String>() { 
         @Override 
         public int refreshData() { 
          return textList.size(); 
         } 
         @Override 
         public void fillData(String[] data, int startPosition, int itemCount) { 
          sleep(); 
          for (int i = 0; i < itemCount; i++) { 
           data[i] = textList.get(startPosition + i); 
          } 
         } 
         private void sleep() { 
          try { 
           Thread.sleep(DELAY_MS); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        }, 
        new AsyncListUtil.ViewCallback() { 
         @Override 
         public void getItemRangeInto(int[] outRange) { 
          outRange[0] = mLinearLayoutManager.findFirstVisibleItemPosition(); 
          outRange[1] = mLinearLayoutManager.findLastVisibleItemPosition(); 
         } 
         @Override 
         public void onDataRefresh() { 
          mRecyclerView.getAdapter().notifyDataSetChanged(); 
         } 
         @Override 
         public void onItemLoaded(int position) { 
          mRecyclerView.getAdapter().notifyItemChanged(position); 
         } 
        }); 
      mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
       @Override 
       public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
        onRangeChanged(); 
       } 
      }); 
     } 
    } 
} 

답변

0

ItemSource를 업데이트해야합니다. itemSource.update(); 앞에 listUtil.refresh();

관련 문제