Android 自定义Listview循环浏览第一个listItem中的所有图像

Android 自定义Listview循环浏览第一个listItem中的所有图像,android,android-custom-view,android-adapter,android-bitmap,Android,Android Custom View,Android Adapter,Android Bitmap,我有一个列表视图,它是从一个带有customlistview的数据库中填充的……除了我第一次启动“活动”时,一切正常,列表视图上的第一个项目在所有图像中循环,然后将每个图像设置为相应的项。我不知道我做错了什么。请帮忙。我已经通读了stackoverflow的所有答案,但没有一个适合我。以下是我的自定义列表视图: ***编辑:此代码现在工作正常。我修好了 public class FriendsListView extends ArrayAdapter<FriendsRowItem>

我有一个列表视图,它是从一个带有customlistview的数据库中填充的……除了我第一次启动“活动”时,一切正常,列表视图上的第一个项目在所有图像中循环,然后将每个图像设置为相应的项。我不知道我做错了什么。请帮忙。我已经通读了stackoverflow的所有答案,但没有一个适合我。以下是我的自定义列表视图:

***编辑:此代码现在工作正常。我修好了

public class FriendsListView extends ArrayAdapter<FriendsRowItem> {
Context context;
ArrayList<FriendsRowItem> infoList;
private LayoutInflater inflater = null;
int Resource;
ViewHolder holder;

public FriendsListView(Context context, int resourceId,
        ArrayList<FriendsRowItem> items) {
    super(context, resourceId, items);
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Resource = resourceId;
    infoList = items;
}

/* private view holder class */
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
}

public int getCount() {
    return infoList.size();
}

public RowItem getItem(RowItem position) {
    return position;
}

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

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (vi == null) {
        vi = inflater.inflate(R.layout.list_item_3, parent, false);
        holder = new ViewHolder();
        holder.txtTitle = (TextView) vi.findViewById(R.id.title3);
        holder.imageView = (ImageView) vi.findViewById(R.id.icon3);
        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }

    holder.txtTitle.setText(infoList.get(position).getTitle());
    holder.imageView.setImageResource(R.drawable.ic_launcher);
    new DownloadImageTask(holder.imageView).execute(infoList.get(position)
            .getImage());

    return vi;
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    ImageView bmImage;
    int position;

    public DownloadImageTask(ImageView bmImage, int position) {
        this.bmImage = bmImage;
        this.position = position;
        bmImage.setTag(position);
        bmImage.setImageBitmap(null);
    }
    protected Bitmap doInBackground(String... urls) {
        String urldisplay = urls[0];
        Bitmap mIcon = null;
        try {
            InputStream in = (InputStream) new java.net.URL(urldisplay)
                    .getContent();

            mIcon = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            // Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return mIcon;
    }

    protected void onPostExecute(Bitmap result) {
        if (result != null && (bmImage.getTag()).equals(this.position))
            bmImage.setImageBitmap(result);
        bmImage.setImageBitmap(result);
    }
}
公共类FriendsListView扩展了ArrayAdapter{
语境;
ArrayList信息列表;
专用充气机=空;
智力资源;
视窗座;
public FriendsListView(上下文,int resourceId,
ArrayList项目){
超级(上下文、资源ID、项目);
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
资源=资源ID;
信息列表=项目;
}
/*私有视图持有者类*/
私有类视窗持有者{
图像视图图像视图;
TextView-txtTitle;
}
public int getCount(){
返回infoList.size();
}
公共行项目getItem(行项目位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
如果(vi==null){
vi=充气机充气(R.layout.list_item_3,父项,假);
holder=新的ViewHolder();
holder.txtTitle=(TextView)vi.findViewById(R.id.title3);
holder.imageView=(imageView)vi.findViewById(R.id.icon3);
vi.setTag(支架);
}否则{
holder=(ViewHolder)vi.getTag();
}
holder.txtitle.setText(infoList.get(position.getTitle());
holder.imageView.setImageResource(R.drawable.ic_启动器);
新建下载ImageTask(holder.imageView).execute(infoList.get(position)
.getImage());
返回vi;
}
私有类DownloadImageTask扩展了AsyncTask{
图像视图bmImage;
内部位置;
公共下载ImageTask(ImageView bmImage,int位置){
this.bmImage=bmImage;
这个位置=位置;
bmImage.setTag(位置);
bmImage.setImageBitmap(空);
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
位图mIcon=null;
试一试{
InputStream in=(InputStream)新建java.net.URL(urldisplay)
.getContent();
mIcon=BitmapFactory.decodeStream(in);
}捕获(例外e){
//Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}
返回mIcon;
}
受保护的void onPostExecute(位图结果){
如果(result!=null&&(bmImage.getTag()).equals(this.position))
bmImage.setImageBitmap(结果);
bmImage.setImageBitmap(结果);
}
}
以及如何使用JSON填充列表视图:

    class RetrieveFriendsTask extends AsyncTask<Void, Void, Void> {
    ArrayList<FriendsRowItem> FriendList = new ArrayList<FriendsRowItem>();
    private ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (pDialog != null) {

            pDialog.dismiss();
        }
        // Showing progress dialog
        else {
            pDialog = new ProgressDialog(Friends.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

    }

    @Override
    protected Void doInBackground(Void... arg0) {

        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();
        List<NameValuePair> pairs = new ArrayList<NameValuePair>();
        pairs.add(new BasicNameValuePair("eposta", email));
        pairs.add(new BasicNameValuePair("sifre", pass));

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET, pairs);

        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            JSONObject jsonObj = null;
            try {
                jsonObj = new JSONObject(jsonStr);
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                JSONObject obj = jsonObj.getJSONObject("data");
                friends = obj.getJSONArray(TAG_EVENTS);
                for (int i = 0; i < friends.length(); i++) {
                    friend = new FriendsRowItem();
                    JSONObject c = friends.getJSONObject(i);
                    nick = c.optString("nick");
                    // friend.setTitle(c.optString("nick"));
                    img = c.optString("url_resim");
                    // friend.setImage(c.optString("url_resim"));
                    friend.setTitle(nick);
                    friend.setImage(img);
                    FriendList.add(friend);
                }

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

        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        return null;
    }

    protected void onPostExecute(Void result) {
        if (pDialog.isShowing())
            pDialog.dismiss();
        adapter = new FriendsListView(Friends.this, R.layout.list_item_3,
                FriendList);
        lvfriends.setAdapter(adapter);
        OnItemClickListener myListViewClicked = new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                FriendsRowItem name = (FriendsRowItem) parent
                        .getItemAtPosition(position);
                Intent i = new Intent(Friends.this, FriendsDisplay.class);
                i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                i.putExtra("FriendName", name.toString());
                startActivity(i);

            }
        };
        lvfriends.setOnItemClickListener(myListViewClicked);
    }

}
类检索FriendsTask扩展了异步任务{
ArrayList FriendList=新建ArrayList();
私人对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
如果(pDialog!=null){
pDialog.disclose();
}
//显示进度对话框
否则{
pDialog=newprogressdialog(Friends.this);
setMessage(“请稍候…”);
pDialog.setCancelable(假);
pDialog.show();
}
}
@凌驾
受保护的Void doInBackground(Void…arg0){
//创建服务处理程序类实例
ServiceHandler sh=新的ServiceHandler();
列表对=新的ArrayList();
添加(新的BasicNameValuePair(“eposta”,电子邮件));
添加(新的BasicNameValuePair(“sifre”,pass));
//向url发出请求并获得响应
字符串jsonStr=sh.makeServiceCall(url,ServiceHandler.GET,pairs);
Log.d(“响应:”、“>”+jsonStr);
if(jsonStr!=null){
JSONObject jsonObj=null;
试一试{
jsonObj=新的JSONObject(jsonStr);
}捕获(JSONException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
试一试{
JSONObject obj=jsonObj.getJSONObject(“数据”);
friends=obj.getJSONArray(标记事件);
for(int i=0;i