0

listview에 도움이 필요합니다. 조각에서 사용하고 있습니다. 앱은 API에서 데이터를 읽으며 내 코드는 정상적으로 작동합니다. 처음에 15 개 항목을로드하고 다음에 10 개 항목을 더로드합니다. 그러나 API에 대한 요청이 15 개 미만의 항목을 반환하면 작동하지 않습니다. 또한 항목 수가 15 또는 25 또는 35의 배수가 아닌 경우 앱이 실패합니다. 이는 초기 설정 후 10 개의 항목을로드하기 때문입니다.ListView - 스크롤을 사용하여 더 많은 항목로드

목록 항목 수에 관계없이 코드를 수정해야합니다. 다음과 같이

내 코드는 다음과 같습니다

(ListaFragment.java가) -> 방법은 어댑터 클래스에서 더 많은 항목을 추가 -> 다음

public class ListaFragment extends ListFragment implements OnScrollListener { 
    public ListaFragment(){} 
    View rootView; 

    ListAdapter customAdapter = null; 
    ListaLugares listaLugares;  

    // values to pagination 
    private View mFooterView; 
    private final int AUTOLOAD_THRESHOLD = 4; 
    private int MAXIMUM_ITEMS; 
    private Handler mHandler; 
    private boolean mIsLoading = false; 
    private boolean mMoreDataAvailable = true; 
    private boolean mWasLoading = false; 

    public int ventana = 0; 
    public int nInitial; 

    private Runnable mAddItemsRunnable = new Runnable() { 
     @Override 
     public void run() { 
      customAdapter.addMoreItems(10); 
      mIsLoading = false; 

     } 
    }; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     rootView = inflater.inflate(R.layout.fragment_lista, container, false); 

     if (container != null) { 
      container.removeAllViews(); 
     } 

     ((MainActivity) getActivity()).setBar(); 


     // read number of places of a category 
     listaLugares.readNumberOfPlaces(); 
     // set 
     setNumbersOfItems(); 
     // read the places a insert in a List 
     listaLugares.readPlaces(15, ventana, listaLugares.idCategoria); 
     //ventana = ventana + 25; 

     return rootView; 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     listaLugares = ((ListaLugares)getActivity().getApplicationContext()); 
    } 


    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     final Context context = getActivity(); 
     mHandler = new Handler(); 
     customAdapter = new ListAdapter(context, listaLugares.lista); 

     mFooterView = LayoutInflater.from(context).inflate(R.layout.loading_view, null); 
     getListView().addFooterView(mFooterView, null, false); 
     setListAdapter(customAdapter); 
     getListView().setOnScrollListener(this); 
    } 


    public void setNumbersOfItems() { 
     if (listaLugares.totalItems > 100) { 
      MAXIMUM_ITEMS = 100; 
      nInitial = 25; 
     } else { 
      MAXIMUM_ITEMS = listaLugares.totalItems; 
      nInitial = listaLugares.totalItems; 
     } 
     Log.v("NUMBER OF ITEMS", "Number: " + MAXIMUM_ITEMS + "-"+ nInitial); 
    } 



    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 

     //Intent myIntent = new Intent(getActivity(), DetalleActivity.class); 
     //myIntent.putExtra("param_id", appState.lista.get(position).id); 
     //getActivity().startActivity(myIntent); 
    } 


    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 

     if (!mIsLoading && mMoreDataAvailable) { 
      if (totalItemCount >= MAXIMUM_ITEMS) { 
       mMoreDataAvailable = false; 
       getListView().removeFooterView(mFooterView); 
      } else if (totalItemCount - AUTOLOAD_THRESHOLD <= firstVisibleItem + visibleItemCount) { 
       ventana = ventana + 10; 
       listaLugares.readPlaces(10, ventana, listaLugares.idCategoria); 
       mIsLoading = true; 
        mHandler.postDelayed(mAddItemsRunnable, 1000); 
      } 
     } 
    } 


    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // Ignore 
    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     if (mWasLoading) { 
      mWasLoading = false; 
      mIsLoading = true; 
      mHandler.postDelayed(mAddItemsRunnable, 1000); 
     } 
    } 


    @Override 
    public void onStop() { 
     super.onStop(); 
     mHandler.removeCallbacks(mAddItemsRunnable); 
     mWasLoading = mIsLoading; 
     mIsLoading = false; 
     ventana = ventana; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
    } 

(ListAdapter.java)를 ListFragment이다.

public class ListAdapter extends ArrayAdapter<Lugar> { 
Context context; 
List<Lugar> values; 

ListaLugares listaLugares; 

private int mCount = 20; 


public ListAdapter(Context context, List<Lugar> values) { 
    super(context, R.layout.row, values); 
    this.context = context; 
    this.values = values; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(R.layout.row, parent, false); 
    TextView firstText = (TextView) row.findViewById(R.id.titulo); 
    TextView secondText = (TextView) row.findViewById(R.id.categoria); 

    firstText.setText(values.get(position).nombre); 
    secondText.setText(values.get(position).categoriaNombre); 

    return row; 
} 


public void addMoreItems(int count) { 
    mCount += count; 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    return mCount; 
} 


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

} 
+0

질문에 '관련 코드'만 포함 시키십시오. http://sscce.org/ – albusshin

+0

을 사용하십시오. http://benjii.me/2010/08/endless-scrolling-listview-in-android/ – njzk2

+0

그래, ListAdapter에서 코드를 편집했지만 모든 코드가 중요하기 때문에 ListaFragment를 요약 할 수 없습니다. 제안 주셔서 감사합니다;) – Yeray

답변

1

일부 코드를 보려면 이전 편집 된 버전에 가입하십시오.

첫 번째 호출은 initiaItems에 15의 값으로 시작하고 ListAdapter 생성자에서 mCount에 설정했기 때문에 작동합니다. 안드로이드리스트 뷰를 렌더링 할 때

public ListAdapter(Context context, List<Lugar> values, int count) { 
    super(context, R.layout.row, values); 
    this.context = context; 
    this.values = values; 
    this.mCount = count; 
} 

그래서,이 함수에 ListAdapter.getCount() 액세서와 mCount (15)를 반환.

하지만 당신은 appState.readPlaces에 의해 반환되는 항목의 수는 왜은 mcount mCount += count;에 번호를 추가하는 알 수없는 경우가

public void addMoreItems(int count, int idCategoria) { 
    appState = ((ListaLugares)getContext().getApplicationContext()); 
    appState.readPlaces(15, mCount, idCategoria); 
    mCount += count; 
    notifyDataSetChanged(); 
} 

로 호출 할 수 있습니다 스크롤 할 때?

appState.readPlaces이 14를 반환하고 count이 15 일 때 15 + 15 항목이 있다고 가정하면 마지막 항목이 충돌합니다.

mCount은 API 호출에서 데이터를 유지하는 객체의 길이를 가져야합니다. 귀하의 경우에는 appState.lista이 될 것으로 생각됩니다.

+0

코드를 수정했지만 문제를 해결할 수 없습니다. 내 새로운 코드가 문제가됩니다. 다음 튜토리얼을 따르겠습니다. http://www.informit.com/articles/article.aspx?p=2066699&seqNum=4 – Yeray

+1

값 목록이 있다면'return (mCount> values.size())? values.size() :'return mCount' 대신에 mCount' – hypd09

관련 문제