Listenansicht Elemente ändert die Position beim Scrollen von Android?

In meiner Anwendung habe ich einen benutzerdefinierten Listenansichtsadapter verwendet. In der Listenansicht habe ich ein anderes Layout hinzugefügt. weil in meinem Service eine Bestellung eine beliebige Anzahl von Bestellpositionen hat. Um die Auftragspositionen anzuzeigen, habe ich das Bestellpositionslayout unten zur benutzerdefinierten Listenansicht hinzugefügt. Es funktioniert einwandfrei. Wenn Sie jedoch in der Listenansicht blättern, werden die Daten geändert.

Adapterklasse:

public class PreviousDataAdapter extends BaseAdapter { ArrayList bpData; private ArrayList arraylist; ArrayList opData; private ArrayList arraylist1; private Activity activity; private LayoutInflater inflater; String g_orderid; DatabaseHandler db; SharedPreferences m_sharedPreference; SharedPreferences.Editor m_editor; ArrayList circless = new ArrayList(); public PreviousDataAdapter(Activity activity, ArrayList bpData,ArrayList 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 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 = new ArrayList(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(); } } } } 

Überschreiben Sie in Ihrer Adapterklasse diese beiden Methoden

 @Override public int getViewTypeCount() { return getCount(); } @Override public int getItemViewType(int position) { return position; } 

Ich hatte das gleiche Problem, dann unten getriggers mein Problem;

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

Grundsätzlich sollten Sie Ihre Elementtypen angeben und dann Ihren Adapter über die Methoden getItemViewType(int position) und getViewTypeCount() überschreiben.

Wenn Sie in den obigen Link schauen, werden Sie es bekommen.

Sie verwenden zwei Arrays – “bpData” und “opData” und Sie werden nur zurückgesetzt, wenn unter bestimmten Bedingungen mit “opData”.

Das ist ein schlechtes Design. Sie benötigen ein Array – wenn “opData” von “bpData” abhängig ist, dann machen Sie es zu einer Variable von “bpData”.

Oder schreibe etwas, um die beiden zu synchronisieren. Ansonsten wissen Sie nicht, wie das Display funktioniert.