2015-03-01 14 views
17

Nella mia applicazione ho usato un adattatore di visualizzazione lista personalizzato. Nell'elemento della vista elenco ho aggiunto un altro layout. perché nel mio servizio un ordine ha un numero qualsiasi di articoli dell'ordine. Per mostrare gli articoli dell'ordine ho aggiunto il layout degli articoli dell'ordine sotto alla lista degli articoli personalizzati item.it funziona perfettamente. ma quando si scorre la lista i dati sono cambiati.Gli elementi della vista elenco cambiano posizione durante lo scorrimento di Android?

classe di adattatori:

public class PreviousDataAdapter extends BaseAdapter { 
    ArrayList<PreviousOrderData> bpData; 
    private ArrayList<PreviousOrderData> arraylist; 
    ArrayList<OrderItemData> opData; 
    private ArrayList<OrderItemData> arraylist1; 
    private Activity activity; 
    private LayoutInflater inflater; 
    String g_orderid; 
    DatabaseHandler db; 
    SharedPreferences m_sharedPreference; 
    SharedPreferences.Editor m_editor; 

    ArrayList<String> circless = new ArrayList<String>(); 

    public PreviousDataAdapter(Activity activity, ArrayList<PreviousOrderData> bpData,ArrayList<OrderItemData> opdata) { 
     // TODO Auto-generated constructor stub 
     this.activity = activity; 
     this.bpData = bpData; 
     this.opData=opdata;//k? 

     // this.opData=bpData.get()//opdata; 
     inflater = LayoutInflater.from(activity); 
     db = new DatabaseHandler(activity); 

    } 


    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return bpData.size(); 
    } 

    @Override 
    public Object getItem(int location) { 
     // TODO Auto-generated method stub 
     return bpData.get(location); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    private int lastPosition = -1; 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     Typeface custom_regular = Typeface.createFromAsset(activity.getAssets(), 
       "fonts/OpenSans-Regular.ttf"); 
     m_sharedPreference = activity.getSharedPreferences("save_details", activity.MODE_PRIVATE); 
     m_editor = m_sharedPreference.edit(); 


     //String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; 
     //final View view; 


     final ViewHolder viewHolder; 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.previousorders_listitem, null); 


      viewHolder.date = (TextView) convertView.findViewById(R.id.date); 
      viewHolder.orderid = (TextView) convertView.findViewById(R.id.orderid); 
      viewHolder.amount = (TextView) convertView.findViewById(R.id.amount); 
      viewHolder.status = (TextView) convertView.findViewById(R.id.status); 
      viewHolder.ordersinfo=(LinearLayout)convertView.findViewById(R.id.previousorders); 
      viewHolder.date .setTypeface(custom_regular); 
      viewHolder.orderid.setTypeface(custom_regular); 
      viewHolder.amount.setTypeface(custom_regular); 
      viewHolder.status.setTypeface(custom_regular); 




      viewHolder.ll_individuvalitem = (LinearLayout) convertView.findViewById(R.id.ll_individuvalitem); 

      //convertView = view; 
      convertView.setTag(viewHolder); 
     }else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.date.setText(bpData.get(position).getDate()); 
     viewHolder.orderid.setText(bpData.get(position).getOrdername()); 
     viewHolder. amount.setText("Rs."+bpData.get(position).getAmount()); 
     viewHolder. status.setText(bpData.get(position).getStatus()); 
     viewHolder.ordersinfo.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       g_orderid =bpData.get(position).getOrderid(); 
       Log.v("TAG_ORDERIDADAPTER",""+g_orderid); 
       new GetReorder().execute(WebUrl.RechargeServiceURL+"APP_Reorder"); 



      } 
     }); 


     //Log.d("size:",opData.size()+""); 
     if(opData!= null && opData.size() >0){opData.clear();} 
     opData = bpData.get(position).getOrderItemDataList();// 
     if(opData.size()>0){ 
      viewHolder.ll_individuvalitem.removeAllViews(); 
      for (int i = 0; i < opData.size(); i++){ 
       // Log.v("TAG Number loop",""+opData.get(i).getNumber()); 
       View itemview = inflater.inflate(R.layout.previousorders_list_single_items, null); 
       TextView Number = (TextView)itemview.findViewById(R.id.Number); 
       TextView RechargeAmount = (TextView)itemview.findViewById(R.id.RechargeAmount); 


       TextView Rechargestatus = (TextView)itemview.findViewById(R.id.Rechargestatus); 
       Number.setTypeface(custom_regular); 
       RechargeAmount.setTypeface(custom_regular); 
       Rechargestatus.setTypeface(custom_regular); 

       Number.setText(opData.get(i).getNumber()); 
       RechargeAmount.setText("Rs."+opData.get(i).getRechargeAmount()); 
       Rechargestatus.setText(opData.get(i).getRechargestatus()); 

       viewHolder.ll_individuvalitem.addView(itemview); 
      } 
     } 



     return convertView; 
    } 


    class ViewHolder { 
     TextView date, tx_month, orderid, amount,status; 
     LinearLayout ll_individuvalitem,ordersinfo; 
    } 

    private class GetReorder extends AsyncTask<String, Void, JSONObject> { 
     /*String mJourneyDate; 
     public GetData(String pJourneyDate) { 
      this.mJourneyDate = pJourneyDate; 
     }*/ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // pDialog = ProgressDialog.show(getActivity(), "", ""); 


     } 

     @Override 
     protected JSONObject doInBackground(String... params) { 
      String response; 

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(params[0]); 
       List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(4); 
       nameValuePair.add(new BasicNameValuePair("OrderID", g_orderid)); 
       nameValuePair.add(new BasicNameValuePair("DeviceID", m_sharedPreference.getString("deviceId",""))); 
       nameValuePair.add(new BasicNameValuePair("PlatformID", "3")); 
       nameValuePair.add(new BasicNameValuePair("UserUniqueID", m_sharedPreference.getString("useruid",""))); 



       httppost.setEntity(new UrlEncodedFormEntity(nameValuePair)); 
       HttpResponse responce = httpclient.execute(httppost); 

       HttpEntity httpEntity = responce.getEntity(); 

       response = EntityUtils.toString(httpEntity); 
       Log.d("response is", response); 

       return new JSONObject(response); 

      } catch (Exception ex) { 

       ex.printStackTrace(); 

      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(JSONObject result) { 
      String Status; 

      super.onPostExecute(result); 
      // Log.v("TAG_RESULT",""+result); 



      if (result != null) { 
       try { 
      Intent intent= new Intent(activity, Payment_Actiivity.class); 
        intent.putExtra("jsonfrompayment",result.toString()); 
        Log.v("TAG_JSONPAY",""+result.toString()); 

        activity.startActivity(intent); 


       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } else { 
       Toast.makeText(activity, "something went wrong", Toast.LENGTH_LONG).show(); 

      } 
     } 
    } 

} 

risposta

89

Nella classe adattatore sovrascrivere questi due metodi

@Override 
    public int getViewTypeCount() { 

    return getCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

    return position; 
    } 
+0

non funziona per me –

+0

È funzionante. Ma la domanda rimane come funziona ?? – Rookie

+2

@Rookie In realtà questi metodi indicano al sistema se l'adattatore deve riciclare le righe o meno, e anche quanti tipi di file vogliamo visualizzare. per informazioni dettagliate su questo andare attraverso questo link: http://stackoverflow.com/a/5301093/4531507 –

0

si utilizzano due array - "bpData" e "opData" e resettato solo se in condizioni particolari con "opData".

Questo è un cattivo design. Hai bisogno di un array - se "opData" dipende da "bpData", quindi rendilo una variabile di "bpData".

Oppure scrivere qualcosa per sincronizzare i due. Altrimenti, non sai come funzionerà il display.

+0

per favore dimmi come todesign –

1

Ho avuto lo stesso problema allora il collegamento sotto risolto il mio problema;

https://stackoverflow.com/a/36738935/3341089

In sostanza, è necessario specificare i tipi di elemento quindi riconfigurare l'adattatore tramite getItemViewType(int position) e getViewTypeCount() metodi di override.

Se si guarda sopra il collegamento, lo otterrete.

Problemi correlati