2014-09-17 5 views
0

목록 뷰를 작성하고 무한 스크롤을 구현했습니다. 목록 뷰는 끝에 도달 할 때까지로드 당 5 개의 항목을 표시하도록 제한되지만 처음 5 개의 항목을 복제합니다. 더 잘 이해할 수 있도록 몇 가지 이미지 : 안드로이드에서 무한 스크롤로 목록보기 반복 항목

enter image description here

내가 그것을 어떻게 해결할 수 있습니까?

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


     // TODO Auto-generated method stub 
     rootView = inflater.inflate(R.layout._fragment_clientes, container, false); 

     rootView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 


     try { 

      lv = (ListView) rootView.findViewById(R.id.listaClientes); 

      clientes = new ArrayList<ClienteModel>(); 
      final ClientViewAdapter ad = new ClientViewAdapter(getActivity(), this, clientes); 

      lv.setVerticalFadingEdgeEnabled(true); 
      lv.setVerticalScrollBarEnabled(true); 

      lv.setOnScrollListener(new EndlessScrollListener(){ 
       @Override 
       public void onLoadMore(int page, int totalItemsCount) { 
        new LoadMoreClientTask(progressBar,FragmentClientes.this,ad,getActivity()).execute(page); 
       } 
      }); 

      lv.addFooterView(footerLinearLayout); 


      lv.setAdapter(ad); 
      new LoadMoreClientTask(progressBar,this,ad,getActivity()).execute(1); 

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

     return rootView; 
    } 

어댑터 대 :

public class ClientViewAdapter extends BaseAdapter { 

    private Activity activity; 
    private FragmentClientes frag; 
    private List<ClienteModel> cliente; 
    private static LayoutInflater inflater=null; 

    public ClientViewAdapter(Context context, FragmentClientes fragmentClientes, List<ClienteModel> clientes) { 
     this.inflater = LayoutInflater.from(context); 
     this.cliente = clientes; 

     frag = fragmentClientes; 

    } 

    public int getCount() { 

     return cliente.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 

     View vi=convertView; 
     ViewHolder holder; 
     if(convertView == null){ 
      vi = inflater.inflate(R.layout.fragment_cliente_item, null); 
      holder=new ViewHolder(); 
      holder.id = (TextView)vi.findViewById(R.id.clienteId); 
      holder.nome = (TextView)vi.findViewById(R.id.clienteNome); 
      holder.tipo = (TextView)vi.findViewById(R.id.clienteTipo); 

      vi.setTag(holder); 
     }else{ 
      holder = (ViewHolder)vi.getTag(); 
     } 

     ClienteModel item = new ClienteModel(); 
     item = cliente.get(position); 

     holder.id.setText(String.valueOf(item.getClientes_id())); 
     holder.nome.setText(item.getNome()); 
     holder.tipo.setText(item.getTipo()); 

     return vi; 
    } 

    public void setData(List<ClienteModel> clientes){ 
     this.cliente.addAll(clientes); 
     this.notifyDataSetChanged(); 
    } 

    public class ViewHolder 
    { 
     TextView id; 
     TextView nome; 
     TextView tipo; 

    } 
} 

그리고 데이터베이스에서 데이터를 가져옵니다 LoadMoreTask 조각 :

protected Boolean doInBackground(Integer... parameters) { 
     int npagina = parameters[0]; 
     cliente= new ArrayList<ClienteModel>(); 

     try { 

      Repositorio mRepositorio = new Repositorio(context); 


      List listaDeClientes = mRepositorio.getClientes(npagina,5,""); 

      cliente = listaDeClientes; 

      System.out.println("pagina " + npagina); 

     }catch (Exception e){ 
      e.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 

기능 getClientes :

public List<ClienteModel> getClientes(Integer pagina, Integer limit, String consulta) throws SQLException { 

     Integer offset = pagina * limit - limit; 


     List<ClienteModel> listaDeRegistros = new ArrayList<ClienteModel>(); 



     if(consulta.isEmpty()) { 
      query = "SELECT * FROM " + tabelaCLIENTES + " WHERE credencial_id = " + mSessao.getString("id_credencial") + " LIMIT " + offset + ", " + limit; 
     }else { 
      query = "SELECT * FROM " + tabelaCLIENTES + " WHERE (credencial_id = " + mSessao.getString("id_credencial") + ") and (nome LIKE '%"+consulta+"%') LIMIT " + offset + ", " + limit; 
     } 

     System.out.println(query); 

     try { 

      Cursor mCursor = bd.rawQuery(query, null); 

      if (mCursor.getCount() > 0) { 
       if (mCursor.moveToFirst()) { 
        do { 
         ClienteModel mClienteModel = new ClienteModel(); 

         mClienteModel.setClientes_id(mCursor.getInt(mCursor.getColumnIndex(ClienteModel.Coluna.CLIENTES_ID))); 
         mClienteModel.setId_rm(mCursor.getInt(mCursor.getColumnIndex(ClienteModel.Coluna.ID_RM))); 
         mClienteModel.setCredencial_id(mCursor.getInt(mCursor.getColumnIndex(ClienteModel.Coluna.CREDENCIAL_ID))); 
         mClienteModel.setNome(mCursor.getString(mCursor.getColumnIndex(ClienteModel.Coluna.NOME))); 
         mClienteModel.setTipo(mCursor.getString(mCursor.getColumnIndex(ClienteModel.Coluna.TIPO))); 
         mClienteModel.setInformacao_adicional(mCursor.getString(mCursor.getColumnIndex(ClienteModel.Coluna.INFORMACAO_ADICIONAL))); 
         mClienteModel.set_criado(mCursor.getString(mCursor.getColumnIndex(ClienteModel.Coluna._CRIADO))); 
         mClienteModel.set_modificado(mCursor.getString(mCursor.getColumnIndex(ClienteModel.Coluna._MODIFICADO))); 
         mClienteModel.set_status(mCursor.getString(mCursor.getColumnIndex(ClienteModel.Coluna._STATUS))); 

         listaDeRegistros.add(mClienteModel); 

        } while (mCursor.moveToNext()); 
       } 
      } 

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

     return listaDeRegistros; 
    } 
+0

'에서 System.out.println ("PAGINA"+ npagina) 무엇을,'인쇄를? 아래로 스크롤 할 때마다 증가합니까? – Leo

+0

@Leo 예, 페이지 수가 줄어들면서 아래로 스크롤합니다. – AND4011002849

답변

1

당신이 타격 더 많이로드하려면 끝내십시오. d 코드가 동일한 5 개의 항목을 다시로드하는 것입니다. 이미로드 한 항목을 확인하고 항목이 더 이상 존재하지 않으면 유효성을 검사하여 항목 추가를 중지해야합니다.

+0

감사합니다. 나는 그 일을하는 방법에 대한 단서가 없습니다. 더 자세히 설명해 주시겠습니까? – AND4011002849

+0

'mRepositorio.getClientes'의 코드를 보지 않고, 이미 검색했는지 여부를 조사하지 않고 일종의 검색을하고 있다고 말할 수 있습니다. –

+0

방금 ​​getClientes 함수를 추가했는데, 무엇인가 잘못 보았습니까? 귀하의 도움을 주셔서 감사합니다 – AND4011002849

0

은 (오프셋과의 교류 제한)이 하나의 시도 :

query = "SELECT * FROM " + tabelaCLIENTES + " WHERE credencial_id = " + mSessao.getString("id_credencial") + " LIMIT " + limit + ", " + offset; 
+0

아니요, 작동하지 않습니다. – AND4011002849

+0

어디에서 'EndlessScrollListener()'를 가져 옵니까? –

관련 문제