2016-01-23 1 views
2

Привет, ребята, я пытаюсь создать собственный список с текстом и изображениями, где изображения поступают с URL-адреса. Я пытаюсь показать их асинхронно с моими элементами списка. но когда я просматриваю список, изображение в элементах списка меняется, а неправильные изображения отображаются в списке. Ниже мой фрагмент кода:customAdapter не работает должным образом с асинхронным обращением изображения

CustomList.java, он implimenting мой базовый адаптер

public class CustomList extends BaseAdapter { 

    //private ArrayList listData; 
    private LayoutInflater layoutInflater; 
    private ArrayList<ListItem> listData; 

    public CustomList(Context context,ArrayList<ListItem> listData) 
    { 

     //Toast.makeText(History.this,"hey",Toast.LENGTH_LONG).show(); 
     this.listData = listData; 
     layoutInflater = LayoutInflater.from(context); 
    } 




    @Override 
    public int getCount() { 
     Log.e("mysize",String.valueOf(listData.size())); 
     return listData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return listData.get(position); 
    } 

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


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

     ViewHolder holder; 
     if(convertView == null) 
     { 
      convertView = layoutInflater.inflate(R.layout.history_row,null); 
      holder = new ViewHolder(); 
      holder.so = (TextView)convertView.findViewById(R.id.SO); 
      holder.name = (TextView)convertView.findViewById(R.id.Name); 
      holder.process = (ImageView)convertView.findViewById(R.id.Process); 
      holder.cloth = (ImageView)convertView.findViewById(R.id.Cloth); 
      convertView.setTag(holder); 

     } 
     else 
     { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     ListItem data = (ListItem)listData.get(position); 

     holder.so.setText(data.getSo()); 

     if(data.getProcess().equals("0")) 
     { 
      holder.process.setImageResource(R.drawable.tick); 
     } 
     else 
     holder.process.setImageResource(android.R.drawable.ic_delete); 
     if(holder.cloth !=null) 
     { 
      holder.name.setText(data.getName()); 
      Log.e("urlsss",data.getUrl()+ data.getName()); 
      new ImageDownload(holder.cloth).execute(data.getUrl()); 
     } 

     return convertView; 


    } 

    static class ViewHolder 
    { 
     TextView so; 
     TextView name; 
     ImageView process; 
     ImageView cloth; 
    } 


} 

ImageDownload.class для загрузки изображений

public class ImageDownload extends AsyncTask<String,Void,Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public ImageDownload(ImageView imageView) 
    { 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    protected Bitmap doInBackground(String... params) 
    { 
     RequestHandler rh = new RequestHandler(); 
     return rh.downloadBitmap(params[0]); 

    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (isCancelled()) { 
      bitmap = null; 
     } 

     if (imageViewReference != null) { 
      ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       if (bitmap != null) { 
        imageView.setImageBitmap(bitmap); 
       } else { 
        Drawable placeholder = imageView.getContext().getResources().getDrawable(android.R.drawable.star_on); 
        imageView.setImageDrawable(placeholder); 
       } 
      } 
     } 
    } 
} 

ListItem.java который производит мои данные для каждой строки в listView

public class ListItem { 

    private String so,name,process,imgUrl; 

    public void setSo(String so) 
    { 
     this.so = so; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public void setProcess(String process) 
    { 
     this.process = process; 
    } 

    public void setUrl(String url) 
    { 
     this.imgUrl = url; 
    } 

    public String getSo() 
    { 
     return so; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public String getProcess() 
    { 
     return process; 
    } 

    public String getUrl() 
    { 
     return imgUrl; } 
} 

Это моя основная деятельность, где называется заказ адаптер

public class History extends AppCompatActivity { 

    //url to fetch data from 
    public static final String URL_HISTORY = "http://192.168.1.233/vendor/history.php"; 

    //Json tags 
    public static final String TAG_JSON_ARRAY="result"; 
    public static final String TAG_SO = "SO"; 
    public static final String TAG_NAME = "CustomerName"; 
    public static final String TAG_DESC = "ClothDescription"; 
    public static final String TAG_DATE = "DeliveryDate"; 
    public static final String TAG_PRODUCT_TYPE = "ProductType"; 
    public static final String TAG_PRODUCT_DESC = "ProductDescription"; 
    public static final String TAG_IMAGE_URL = "ImageUrl"; 
    public static final String TAG_PROCESS = "Process"; 



    HashMap<String,String> data = new HashMap<>(); 
    ArrayList<ListItem> detail_list; 
    ListView listView; 


    //key to put in hashmap 
    public static final String VENDOR_NAME = "Username"; 


    //to store fetched data 
    String[] so; 
    String[] customerName; 
    String[] clothesDesc; 
    String[] delivDate; 
    String[] prodType; 
    String[] prodDesc; 
    String[] imgUrl; 
    String[] process; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_history); 

     listView =(ListView)findViewById(R.id.listView); 
     detail_list = new ArrayList<ListItem>(); 

     //to get vendorname 
     SharedPreferences sharedPref = getSharedPreferences("vendorInfo", Context.MODE_PRIVATE); 
     String vendor_name =sharedPref.getString("username", ""); 
     data.put(VENDOR_NAME, vendor_name); 

     fetchHistory(); 


    } 


    public void fetchHistory() 
    { 
     class FetchHistory extends AsyncTask<Void,Void,String> 
     { 
      ProgressDialog loading; 
      protected void onPreExecute() 
      { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(History.this,"Fetching...","Wait",false,false); 
      } 
      protected String doInBackground(Void...params) 
      { 
       RequestHandler rh = new RequestHandler(); 
       String result = rh.sendPostRequest(URL_HISTORY, data); 
       return result; 
      } 

      protected void onPostExecute(String s) 
      { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       Log.e("myjson",s); 
       showHistory(s); 
      } 
     } 

     FetchHistory fh = new FetchHistory(); 
     fh.execute(); 
    } 

    public void showHistory(String json) 

    { 


     try { 
      JSONObject jsonObject = new JSONObject(json); 
      JSONArray result = jsonObject.getJSONArray(TAG_JSON_ARRAY); 
      int length = result.length(); 
      so = new String[length]; 
      customerName = new String[length]; 
      clothesDesc = new String[length]; 
      delivDate = new String[length]; 
      prodType = new String[length]; 
      prodDesc = new String[length]; 
      imgUrl = new String[length]; 
      process = new String[length]; 
      for (int i = 0; i < result.length(); i++) { 
       JSONObject c = result.getJSONObject(i); 
       so[i] = c.getString(TAG_SO); 
       customerName[i] = c.getString(TAG_NAME); 
       clothesDesc[i] = c.getString(TAG_DESC); 
       delivDate[i] = c.getString(TAG_DATE); 
       prodType[i] = c.getString(TAG_PRODUCT_TYPE); 
       prodDesc[i] = c.getString(TAG_PRODUCT_DESC); 
       imgUrl[i] = c.getString(TAG_IMAGE_URL); 
       process[i] = c.getString(TAG_PROCESS); 

      } 
     } 
      catch(JSONException e) 
      { 
       Log.e("myexception",e.toString()); 
      } 


      for(int i =0;i<customerName.length;i++) 
      { 
       //storing all value in hashmap 
       ListItem values = new ListItem(); 
       values.setSo(so[i]); 
       values.setName(customerName[i]); 
       values.setUrl(imgUrl[i]); 
       Log.e("myurl", imgUrl[i]); 
       values.setProcess(process[i]); 

       detail_list.add(values); 
      } 




       Toast.makeText(this,"hey",Toast.LENGTH_LONG).show(); 
       Log.e("hey", "hey00"); 


     CustomList customList = new CustomList(this,detail_list); 
     listView.setAdapter(customList); 
     Toast.makeText(this,"you",Toast.LENGTH_LONG).show(); 
     Log.e("you", "you00"); 
    } 


} 

Мой файл макета для каждой строки

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/linear"> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <TextView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:id="@+id/SO" 
      android:layout_marginRight="10dp" 
      android:layout_weight="2" /> 

     <TextView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:id="@+id/Name" 
      android:layout_marginRight="10dp" 
      android:layout_weight="2" /> 

     <ImageView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:id="@+id/Process" 
      android:layout_weight="1" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 


     <ImageView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:id="@+id/Cloth" 
      android:layout_weight="1" 
      android:scaleType="fitXY" /> 
    </LinearLayout> 
</LinearLayout> 
+0

y использовать используя BaseAdapter использовать ArrayAdapter пожалуйста? если вы не делаете что-то действительно стоящее, не используйте BaseAdapter – sector11

+0

Какую загрузку изображения вы используете, вы можете попробовать Glide или Picasso очень легкий вес и прекрасно работает – sector11

ответ

0

Это распространенная ошибка. Ваш listView перерабатывает представления, поэтому вместо создания представлений для 100 элементов в listView он просто создает достаточно, чтобы заполнить экран.

Как вы прокрутите вниз, что ImageView, который был использован для позиции # 1, теперь же ImageView используется для позиции # 11 и # 21, и так далее ...

Исправление требуют отслеживания того, что позиции в настоящее время отображаются пользователю, и только установка изображений для этих позиций и очистка связанного изображения (или отмена ожидающей загрузки), когда он падает с экрана.

Вы можете определить, когда ваш ImageView переназначается, потому что он снова будет вызван в getView, и оттуда вы сможете выяснить, есть ли ожидающая загрузка, которую нужно отменить.

Рассмотрите возможность использования одного из существующих решений или просто ознакомьтесь с тем, как другие сделали это для полного примера. https://github.com/nostra13/Android-Universal-Image-Loader

Смежные вопросы