【发布时间】:2016-05-28 07:22:08
【问题描述】:
我正在使用自定义ListView,当我转到上一个活动并再次转到该 ListViewActivity 时,它的数量会翻倍(重复的 listItems)。
我可以看到问题发生在哪里。当我第一次进入 ListViewActivity 时,将列表项添加到 ArrayList 并设置适配器时,一切都很好。但是当我去上一个活动并再次进入 ListViewActivity 时,先前设置的列表项仍然存在于 Adapter 中,并且当进程通过 setAdapter() 时再次设置列表项,这导致了列表项的重复。
我遇到过许多解决方案,例如使用notifyDataSetChanged()、清除ArrayList、setAdapter(null) 等。这些解决方案都没有帮助我。
我想解决方案是清除 Adapter 和 ArrayList 并刷新 Adapter。但我不知道具体怎么做以及在哪里做。
这是我的代码:
这是LoadingActivity.java中的数据接收类
private class CategoriesAsyncTask extends AsyncTask<String,Integer,Double>{
String res="";
String curState ="";
String httppoststr="";
boolean isNxtActivity=false;
@Override
protected Double doInBackground(String... params) {
// TODO Auto-generated method stub
postData(params[0]);
return null;
}
protected void onPostExecute(Double Result)
{
if(isNxtActivity)
{
Intent intent = new Intent(LoadingActivity.this, ListItemsActivity.class);
if(curState.equals(Constants.STATE_GET_STOCK_ITEMS))
{
intent.putStringArrayListExtra(Constants.STOCK_ITEMS_LIST, listOfItems);
intent.putExtra("curState", Constants.STATE_GET_STOCK_ITEMS);
intent.putExtra(Constants.CATEGORY_ID, categoryId);
intent.putExtra(Constants.CUSTOMER_ID, customerId);
LoadingActivity.this.startActivity(intent);
}
}
}
public void postData(String ValueIWantToSend) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(Constants.GatewayUrl);
try
{
JSONObject json = new JSONObject(ValueIWantToSend);
curState = json.getString("curState");
StringEntity se = new StringEntity(ValueIWantToSend);
httppost.setEntity(se);
httppost.setHeader("Accept", "application/json");
httppost.setHeader("Content-type", "application/json");
httppoststr =httppost.toString();
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
res = EntityUtils.toString(entity, "UTF-8");
JSONObject jsonobj = new JSONObject(res);
String state = jsonobj.getString(Constants.STATE);
if(Constants.RESPONSE_SUCCESS.equals(state.toLowerCase()))
{
isNxtActivity =true;
if(curState.equals(Constants.STATE_GET_STOCK_ITEMS))
{
JSONArray itemsListJsonArray=new JSONArray();
itemsListJsonArray=jsonobj.getJSONArray(Constants.STOCK_ITEMS_LIST);
for(int i=0;i<itemsListJsonArray.length();i++)
{
String itemslist=itemsListJsonArray.getString(i);
listOfItems.add(itemslist.toString());
}
}
}
}
catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
}
}
ListViewActivity.java
private String[] arrayOfNames;
private String[] arrayOfImageUrls;
ArrayList<String> listOfNames = new ArrayList<String>();
ArrayList<String> listOfImageUrls = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_items);
itemsList=(ListView) findViewById(R.id.itemsList);
Bundle extras = getIntent().getExtras();
listOfItems = extras.getStringArrayList(Constants.STOCK_ITEMS_LIST); //The duplication occurs here while getting the data from the LoadingActivity when visiting this activity for the second time.
arrayOfNames = new String[listOfNames.size()];
for(int i=0;i<listOfNames.size();i++)
{
arrayOfNames[i]=listOfNames.get(i);
}
arrayOfImageUrls = new String[listOfImageUrls.size()];
for(int i=0;i<listOfImageUrls.size();i++)
{
arrayOfImageUrls[i]=listOfImageUrls.get(i);
}
listItemadapter = new CustomListItemsAdapter(this, arrayOfNames, arrayOfImageUrls);
itemsList.setAdapter(listItemadapter);
}
CustomAdapter.java
public class CustomListItemsAdapter extends BaseAdapter{
private Context context;
private LayoutInflater inflater;
private String[] arrayOfNames;
public CustomListItemsAdapter(ListItemsActivity listItemsActivity, String[] itemsName) {
// TODO Auto-generated constructor stub
context=listItemsActivity;
arrayOfNames = itemsName;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return arrayOfNames.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public static class ViewHolder
{
private TextView itemName;
private ImageView itemImage;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null)
{
holder=new ViewHolder();
convertView = inflater.inflate(R.layout.list_item_content, parent, false);
holder.itemName = (TextView) convertView.findViewById(R.id.itemName);
holder.itemImage = (ImageView) convertView.findViewById(R.id.itemImage);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.itemName.setText(arrayOfNames[position]);
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
ListItemsAsyncTask listAsync = new ListItemsAsyncTask();
Drawable drawableIcon = listAsync.loadImageFromServer(arrayOfImageUrls[position]);
holder.itemImage.setImageDrawable(drawableIcon);
return convertView;
}
private class ListItemsAsyncTask extends AsyncTask<String, Integer, Double> {
String httpPostStr, res;
Boolean NextActivity = false;
public Drawable loadImageFromServer(String url)
{
try {
InputStream is = (InputStream) new URL(url).getContent();
Drawable drawable = Drawable.createFromStream(is, "src name");
return drawable;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected Double doInBackground(String... params) {
return null;
}
}
有什么建议吗???
更新:我发现了这个重复背后的问题。当我第二次来到 ListViewActivity 时,重复发生在 Bundle 中,我从中获取了 ListView 及其内容的数据。
现在我需要一个解决方案来阻止 Bundle 中的重复。我在 ListViewActivity.java 中用注释提到了重复发生的行
【问题讨论】:
-
请向我们展示您的代码
-
@Nisarg 我已经添加了代码。
标签: android listview arraylist