删除项目后,ListView中的剩余项目位置不正确

问题描述:

删除ListView中的项目后,我无法获取正确的项目。 该位置应该适合ArrayList中项目的索引,但是在删除ListView中的项目后,位置不正确(甚至可能会导致indexoutofbounds异常。)删除项目后,ListView中的剩余项目位置不正确

我敢打赌,它与视图位置,但我就是无法找到错误

我有一个内部BaseAdapter类此ListActivity类:

public class MSMobilMyStocksActivity extends ListActivity { 
    static MyStocksCtr myStocksCtr; 
    static ListView listview; 



    static EfficientAdapter adap; 
    boolean downloadSuccess; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mystockslist); 
     mContext = this; 
     listview = getListView(); 
     myStocksCtr = MyStocksCtr.getInstance(mContext); 

     adap = new EfficientAdapter(this); 

     setListAdapter(adap); 
     if (isOnline()) 
      new InsertDataTask().execute(); 
     else { 
      startTimer(); 
      Toast.makeText(mContext, "Du har ingen internetforbindelse", 1000) 
        .show(); 
     } 

    } 

    public static boolean updateData() { 
     return myStocksCtr.downloadJson(); 
    } 

    private class InsertDataTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      try { 
       listview.setEnabled(false); 
      } catch (Exception e) { 
      } 
     } 

     // can use UI thread here 
     @Override 
     protected void onPostExecute(final Void unused) { 
      if (isOnline()) { 
       if (downloadSuccess) { 
        try { 
         if (myStocksCtr.getArray().size() == 0) { 
          Toast.makeText(mContext, "Ingen data hentet", 2000) 
            .show(); 
         } else if (myStocksCtr.getArray().size() == 1 
           && myStocksCtr.getArray().get(0) 
             .getString("FH_FULLNAME").equals("-")) { 
          Toast.makeText(mContext, "Ingen data hentet", 2000) 
            .show(); 
         } else { 
          adap.notifyDataSetChanged(); 
         } 
        } catch (JSONException e) { 
         Toast.makeText(mContext, "JSONException", 2000).show(); 
        } 
       } 
      } else 
       Toast.makeText(mContext, "Du har ingen internetforbindelse", 
         1000).show(); 
      startTimer(); 
      try { 
       listview.setEnabled(true); 
      } catch (Exception e) { 
      } 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      downloadSuccess = false; 
      if (isOnline()) { 
       try { 
        if (updateData()) 
         downloadSuccess = true; 
       } catch (Exception e) { 
        Toast.makeText(mContext, "Fejl under download af data", 
          2000).show(); 
        downloadSuccess = false; 
       } 
      } else 
       Toast.makeText(mContext, "Du har ingen internetforbindelse", 
         1000).show(); 

      return null; 

     } 
    } 

    } 

    public static class EfficientAdapter extends BaseAdapter implements 
      Filterable { 
     private LayoutInflater mInflater; 
     private Context context; 

     public EfficientAdapter(Context context) { 
      mInflater = LayoutInflater.from(context); 
      this.context = context; 
     } 


     @Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      final ViewHolder holder; 

      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.mylistitem, null); 

       holder = new ViewHolder(); 
       holder.stockName = (TextView) convertView 
         .findViewById(R.id.stockName1); 
       holder.stockPrice = (TextView) convertView 
         .findViewById(R.id.stockValue1); 
       holder.stockChange = (TextView) convertView 
         .findViewById(R.id.stockChange1); 
       holder.stockPctChange = (TextView) convertView 
         .findViewById(R.id.stockPctChange1); 

       convertView.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         try { 
          Intent i = new Intent(mContext, MSStockDetailActivity.class); 
          Bundle b = new Bundle(); 
          b.putInt("position", position); //Your id 
          b.putBoolean("isMyStocks", true); 
          i.putExtras(b); //Put your id to your next Intent 
          mContext.startActivity(i); 
         } catch (Exception e) { 
          Toast.makeText(mContext, "OnClick error ", 2000) 
            .show(); 
         } 
        } 
       }); 

       convertView.setOnLongClickListener(new OnLongClickListener() { 

        @Override 
        public boolean onLongClick(View arg0) { 

         final CharSequence[] items = { 
           "See stock details", 
           "Delete the stock \"" + holder.stockName.getText() 
             + "\" from the list", "Cancel" }; 

         AlertDialog.Builder builder = new AlertDialog.Builder(
           mContext); 
         builder.setTitle("Configure list"); 
         builder.setItems(items, 
           new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, 
              int item) { 
             if (item == 1) { 
              myStocksCtr.removeStock(holder.ric); 
              adap.notifyDataSetChanged(); 
             } else if (item == 2) { 
             } 
             Toast.makeText(mContext, items[item], 
               Toast.LENGTH_SHORT).show(); 
            } 
           }); 
         AlertDialog alert = builder.create(); 
         alert.show(); 
         return true; 
        } 
       }); 

       convertView.setTag(holder); 
      } else { 

       holder = (ViewHolder) convertView.getTag(); 
      } 
      try { 
       String result = myStocksCtr.getArray().get(position) 
         .getString("FH_FULLNAME"); 
       holder.stockName.setText(result); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      try { 
       String result = myStocksCtr.getArray().get(position) 
         .getString("FH_RIC"); 
       holder.ric = result; 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      // + String.valueOf(position)); 
      try { 
       String result = myStocksCtr.getArray().get(position) 
         .getString("FH_PRC"); 
       if (String.valueOf(result.charAt(result.length() - 2)).equals(
         ".")) { 
        result += "0"; 
       } 
       ; 
       holder.stockPrice.setText(result); 

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

      holder.position = position; 

      return convertView; 
     } 

     static class ViewHolder { 
      String ric; 
      TextView stockName; 
      TextView stockPrice; 
      TextView stockPctChange; 
      TextView stockChange; 
      int position; 

     } 

     @Override 
     public Filter getFilter() { 
      return null; 
     } 

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

     @Override 
     public int getCount() { 
      return myStocksCtr.getArray().size(); 
     } 

     @Override 
     public JSONObject getItem(int position) { 
      return myStocksCtr.getArray().get(position); 
     } 

    } 

这是一些在我的库存控制的事情(其中数组是):

public class MyStocksCtr { 

private static MyStocksCtr INSTANCE = null; 

ArrayList<String> myStocksArray; 
JSONCtr jsonCtr; 
static Context mContext; 
boolean isRunning = false; 
ArrayList<JSONObject> myArray; 

MyStocksCtr(Context mContext) { 
    this.mContext = mContext; 
    jsonCtr = new JSONCtr(mContext); 
    myStocksArray = new ArrayList<String>(); 
    myArray = new ArrayList<JSONObject>(); 
    } 
} 

public static MyStocksCtr getInstance(Context context){ 
    mContext = context; 
    if(INSTANCE == null) { 
      INSTANCE = new MyStocksCtr(mContext); 
     } 
     return INSTANCE; 
} 

public ArrayList<JSONObject> getArray() { 
    return myArray; 
} 

public boolean downloadJson() { 
    if (!myStocksArray.isEmpty()) { 
     String myStocksString = ""; 
     for (String s : myStocksArray) 
      myStocksString += (s + "%2C"); 
     myStocksString = myStocksString.substring(0, 
       myStocksString.length() - 3); 
     jsonCtr.getJSON(preStocksUrl + myStocksString + postStocksUrl); 
     myArray.clear(); 
     myArray.addAll(jsonCtr.getArray()); 
     return true; 
    } else { 
     return false; 
    } 
} 


public void removeStock(String newStock) { 
    JSONObject toRemove = null; 

    for (JSONObject obj : myArray) { 
     try { 
      if (obj.getString("FH_RIC").equals(newStock)) { 
       toRemove = obj; 
      } 
     } catch (JSONException e) { 
      Toast.makeText(mContext, "Kunne ikke fjerne objekt", 1000) 
        .show(); 
     } 
    } 
    if (toRemove != null){ 
     myStocksArray.remove(newStock); 
    jsonCtr.removeRic(toRemove); 
    myArray = jsonCtr.getArray(); 
    saveMyStocks(); 
} 
    } 

    } 

在我jsonCtr我删除和获取数组:

public ArrayList<JSONObject> getArray() { 
    return rics1; 
} 

public void removeRic(Object o){ 
    rics1.remove(o); 
} 

当我已删除从列表中选择对象,更新列表,所以该项目就不再出现。但是这些观点的立场全都搞砸了,其中有些是过时的。

我猜它与GetView中的位置有关系是最终的,但我不确定吗?如果这是问题,我该如何纠正?

+0

仍然不完整的代码为listview请提供listview实现代码在这里 – Pratik

+0

代码现在编辑..我已经添加了整个ListActivity .. – JReneM

+0

我完全忘记了:请发布您的logcat输出(异常堆栈)。这肯定会有很大的帮助;-) – Knickedi

嗯,我没有看过你的代码的每一个细节,但我认为你错过了打电话给myAdaper。更改你的数组后更改为notifyDataSetChanged()

编辑

这* S真的很难看低谷,因为这是一个很大的代码,你在这里发表。所以这就是我得到的。我看不出这是怎么回事在(股票删除),但必须有我觉得不对劲:

jsonCtr.removeRic(toRemove); 
myArray = jsonCtr.getArray(); 

请不要张贴整个代码也一样,尽量将其降低到实际问题。我不会再检查整个代码...

+0

代码已更新..在数组中更改时使用notifyDataSetChanged() - 但它是正确的方式吗? – JReneM

+0

对不起 - 我对此很陌生.. 我已经添加了您所指的代码.. – JReneM