Android 投掷后,圆形imageview显示在listview中

Android 投掷后,圆形imageview显示在listview中,android,listview,android-listview,Android,Listview,Android Listview,Im使用Glide加载图像和用户的个人资料图片,生成一个充满图像的提要(类似于instagram post)。从服务器获取数据后,我将图像的Url加载到listitem中。最初,所有项目都已正确加载 问题是,当我快速滚动listview时,会显示用户配置文件图片,并且该视图不会响应onClick事件。请解释为什么会发生这种情况,我如何解决 每个列表项的XML布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns

Im使用Glide加载图像和用户的个人资料图片,生成一个充满图像的提要(类似于instagram post)。从服务器获取数据后,我将图像的Url加载到listitem中。最初,所有项目都已正确加载

问题是,当我快速滚动listview时,会显示用户配置文件图片,并且该视图不会响应onClick事件。请解释为什么会发生这种情况,我如何解决

每个列表项的XML布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="20dp"
android:orientation="vertical" >

<RelativeLayout android:id="@+id/userheader"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginTop="10dp"
    android:layout_weight="1">

 <com.mikhaellopez.circularimageview.CircularImageView
    android:id="@+id/realdp"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/nodp"
    android:scaleType="centerCrop"
    android:adjustViewBounds="true"/>

    <TextView
    android:id="@+id/handle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/realdp"
    android:text="handle"
    android:layout_marginLeft="3dp"
    android:gravity="center_vertical"
    android:layout_alignTop="@+id/realdp"
    android:layout_alignBottom="@+id/realdp"
    android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
    android:id="@+id/uploadtime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/handle"
    android:layout_marginRight="5dp"
    android:layout_alignParentRight="true"
    android:text="time"
    android:textAppearance="?android:attr/textAppearanceSmall" />

  <RelativeLayout android:id="@+id/rlimg"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_below="@+id/handle">

  <ImageView
    android:id="@+id/imgpost"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"
    android:background="#ffffff"/>
  </RelativeLayout> 

 <RelativeLayout android:id="@+id/bottom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/rlimg"
    android:layout_marginTop="5dp">

   <com.sivaram.fishograph.FlipImageView
    android:id="@+id/like"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#00000000"
    android:layout_marginLeft="20dp"
    android:src="@drawable/hook_unlike"/>

    <ImageButton
    android:id="@+id/comment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#00000000"
    android:layout_toRightOf="@+id/likesnum"
    android:layout_marginLeft="20dp"
    android:src="@drawable/comment" />

    <ImageButton
    android:id="@+id/more"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="3dp"
    android:layout_alignParentRight="true"
    android:background="#00000000"
    android:src="@drawable/more" />

    <TextView
    android:id="@+id/likesnum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/like"
    android:layout_alignTop="@+id/like"
    android:layout_marginLeft="5dp"
    android:layout_toRightOf="@+id/like"
    android:text="likes"
    android:gravity="center_vertical"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#440011" />

    <TextView
    android:id="@+id/comnum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/comment"
    android:layout_alignTop="@+id/comment"
    android:layout_marginLeft="10dp"
    android:layout_toRightOf="@+id/comment"
    android:gravity="center_vertical"
    android:text="comments"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#440011" />

   </RelativeLayout>

  </RelativeLayout>  

 <TextView
    android:id="@+id/caption"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:layout_below="@+id/userheader"
    android:gravity="center_horizontal"
    android:layout_weight="1"
    android:text="Caption"
    android:textAppearance="?android:attr/textAppearanceMedium" />
 <TextView
    android:id="@+id/dummy"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:layout_below="@+id/caption"
    android:gravity="center_horizontal"
    android:layout_weight="1"
    android:text=""
    android:textAppearance="?android:attr/textAppearanceMedium" />            
 </LinearLayout>

用于生成提要的Java代码:

public class Feed extends Fragment implements OnScrollListener
{ 
    String handle;
    ListView lvposts;
    Jsparser jp;
    int width,height;
    int maxMemory;
    int currentFirstVisibleItem ;
    int currentVisibleItemCount;
    PostAdapter pa;
    ArrayList<eachpost> posts;
    int value = 1;
    boolean isLoading = false;
    int photoid;
    private List<String> myData;
    Boolean tapped = false, Loading= false;
    SharedPreferences spf;
    ArrayList<String> likes;
    public Feed()
    {
      super();
    }

    Feed(String handle)
    {
      super();
      photoid = 99999999;
      this.handle = handle; 
    }

    @Override
    public void onCreate(Bundle b)
    {
     super.onCreate(b);
     maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
     final int cacheSize = maxMemory / 8;
     spf = getActivity().getSharedPreferences("prefs",Context.MODE_PRIVATE);
        likes = new ArrayList<String>();
    }
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup vg,  Bundle b)
    { 
      View v = inflater.inflate(R.layout.allposts, vg, false);
      ActionBar ab = ((ActionBarActivity) getActivity()).getSupportActionBar();
      ab.setBackgroundDrawable(new ColorDrawable(Color.RED));
      ab.hide();
      lvposts = (ListView) v.findViewById(R.id.lvposts);
      jp = new Jsparser();
      Display d = getActivity().getWindowManager().getDefaultDisplay();
      width = d.getWidth();
      height = d.getHeight();
      lvposts.setOnScrollListener(this);
      posts = new ArrayList<eachpost>();
      pa = new     PostAdapter(getActivity(),R.layout.postcontent,posts,inflater);
      Loading = true;
      lvposts.setAdapter(pa);
      new GetData(photoid).execute(); 
      return v;
     }

class GetData extends AsyncTask<String,String,String>
  {
    String msg;
    Integer limit,success=0;
    ProgressDialog pd;
    Bitmap dpbm;
    GetData(int l)
    {
        limit = l;
    }
    @Override
    public void onPreExecute()
    {
    }
    @Override
    protected String doInBackground(String... params) {
        List<NameValuePair> lp = new ArrayList<NameValuePair>();
        lp.add(new BasicNameValuePair("handle",handle));
        lp.add(new BasicNameValuePair("photoid",limit.toString()));
        JSONObject job = jp.makeHttpRequest("server/getfeed.php", "POST", lp);

        try
        {
          Log.d("json", job.toString());
          success = job.getInt("success");
          msg = job.getString("message");
          if(success==1)
          {
            JSONArray ja = job.getJSONArray("posts");
            for(int c = 0; c<ja.length(); c++)
            {
              JSONObject jb = ja.getJSONObject(c);
              posts.add(new eachpost(jb.getString("handle"),jb.getString("url"), jb.getString("caption"),
              jb.getString("uldatetime"), jb.getInt("likescount"), jb.getInt("comcount"), jb.getString("dpurl"), jb.getInt("isliked"),jb.getInt("photoid") ));
            }
          }
          else
          {
          }
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
        return msg;
     }

    @Override
    public void onPostExecute(String url)
    {
     Loading = false;
     if(success==1)
      {    
        photoid = posts.get(posts.size()-1).getPhotoid();
        Log.d("last id",photoid+"");
        Log.d("Length of posts",""+posts.size());
        pa.notifyDataSetChanged();
      }
    }

  }

class PostAdapter extends ArrayAdapter<eachpost> 
{
  ViewHolder vholder;
  String root = Environment.getExternalStorageDirectory().toString();
  File dir = new File (root + ".feed");
  Map<Integer,View> myViews;
    public PostAdapter(Context context, int resource, ArrayList<eachpost> list, LayoutInflater li) {
        super(context, R.layout.postcontent, list); 
        myViews = new HashMap<Integer,View>();
    }

    @Override
    public View getView(final int pos,View v,ViewGroup vg)
    {   
      final eachpost post = posts.get(pos);
      final String imgurl = post.getPhotoUrl();
      String dpurl = post.getDpurl();
      int isliked = post.getIsliked();
      View row = myViews.get(pos);
      if(row == null)
      { 
        row = getActivity().getLayoutInflater().inflate(R.layout.postcontent,vg,false); 
        row.setMinimumHeight(height);
        vholder = new ViewHolder();
        vholder.handle = ((TextView) row.findViewById(R.id.handle));
        vholder.caption = ((TextView) row.findViewById(R.id.caption));
        vholder.likesnum = ((TextView) row.findViewById(R.id.likesnum));
        vholder.comnum = ((TextView) row.findViewById(R.id.comnum));
        vholder.uploadtime = ((TextView) row.findViewById(R.id.uploadtime));
        vholder.photo = (ImageView) row.findViewById(R.id.imgpost);
        vholder.feeddp = (CircularImageView) row.findViewById(R.id.realdp);
        vholder.like = (FlipImageView) row.findViewById(R.id.like);
            LayoutParams lp = vholder.photo.getLayoutParams();
        lp.width = width;
        lp.height = width;

        vholder.handle.setText(post.getHandle());
        vholder.caption.setText(post.getCaption());
        vholder.likesnum.setText(post.getLikes()+"");
        vholder.comnum.setText(post.getComments()+"");
        vholder.uploadtime.setText(post.getUl());
        Drawable d = getResources().getDrawable(R.drawable.hook_like);
        vholder.like.setFlippedDrawable(d);
        Glide.with(getActivity()).load("server/"+imgurl).into(vholder.photo);

        if(dpurl.contains("http"))
            Glide.with(getActivity()).load(dpurl).into(vholder.feeddp);
        else
            Glide.with(getActivity()).load("server/"+dpurl).into(vholder.feeddp);
        Log.d("image loading", dpurl + "-" + imgurl);
        if(isliked==1)
             {
               vholder.like.setFlipped(true,false);
               likes.add(imgurl);
             }

        vholder.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                View temp = myViews.get(pos);
                final FlipImageView like = (FlipImageView) temp.findViewById(R.id.like);
                final TextView likesnum = (TextView) temp.findViewById(R.id.likesnum);
                like.toggleFlip();

                if(!likes.contains(imgurl))
                   {
                    posts.get(pos).incrementLikes(handle);
                    likes.add(posts.get(pos).getPhotoUrl());
                    likesnum.setText(posts.get(pos).getLikes()+"");
                  }
                else
                  {
                    likes.remove(posts.get(pos).getPhotoUrl());
                    posts.get(pos).decrementLikes(handle);
                    likesnum.setText(posts.get(pos).getLikes()+"");
                  }

            }
        });

        row.setTag(vholder);
        myViews.put(pos, row);
      }

       return row;
    }

    @Override
    public boolean isEnabled(int position)
    {
        return true;
    }

}  //end of adapter class

static class ViewHolder {
        TextView handle;
        TextView caption;
        TextView likesnum;
        TextView comnum;
        TextView uploadtime;
        ImageView photo;
        CircularImageView feeddp;
        FlipImageView like;
   }

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
   if (this.currentVisibleItemCount > 0 && scrollState == SCROLL_STATE_FLING) {
    /*** In this way I detect if there's been a scroll which has completed ***/
    /*** do the work for load more date! ***/

        if(currentFirstVisibleItem > (currentVisibleItemCount - 2) && Loading!=true)
        {
            new GetData(photoid).execute();
        }       
   }
  }

 @Override
 public void onScroll(AbsListView view, int firstVisibleItem,
    int visibleItemCount, int totalItemCount) {
    this.currentFirstVisibleItem = firstVisibleItem;
    this.currentVisibleItemCount = visibleItemCount;

 }  
}
公共类提要扩展了OnScrollListener的片段实现
{ 
弦柄;
ListView-lvposts;
jsp;
int宽度、高度;
int-maxMemory;
int currentFirstVisibleItem;
int currentVisibleItemCount;
后适应pa;
ArrayList职位;
int值=1;
布尔isLoading=false;
内光体;
私有列表数据;
布尔抽头=假,加载=假;
共享参考spf;
ArrayList喜欢;
公共提要()
{
超级();
}
进给(字符串手柄)
{
超级();
photoid=9999999;
this.handle=handle;
}
@凌驾
创建时的公共void(Bundle b)
{
super.onCreate(b);
maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
最终int cacheSize=maxMemory/8;
spf=getActivity().getSharedReferences(“prefs”,Context.MODE\u PRIVATE);
likes=newarraylist();
}
@凌驾
创建视图上的公共视图(平面充气机、视图组vg、捆绑包b)
{ 
视图v=充气机。充气(R.layout.allposts,vg,false);
ActionBar ab=((ActionBarActivity)getActivity()).getSupportActionBar();
ab.setBackgroundDrawable(新彩色可拉丝(颜色为红色));
ab.隐藏();
lvposts=(ListView)v.findViewById(R.id.lvposts);
jp=newjsparser();
显示d=getActivity().getWindowManager().getDefaultDisplay();
宽度=d.getWidth();
高度=d.getHeight();
lvposts.setOnScrollListener(这个);
posts=newarraylist();
pa=新的PostAdapter(getActivity(),R.layout.postcontent,posts,inflater);
加载=真;
lvposts.setAdapter(pa);
新建GetData(photoid.execute();
返回v;
}
类GetData扩展异步任务
{
串味精;
整数限制,成功=0;
进展性帕金森病;
位图dpbm;
获取数据(int l)
{
极限=l;
}
@凌驾
公共无效onPreExecute()
{
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
List lp=new ArrayList();
lp.添加(新的BasicNameValuePair(“句柄”,句柄));
lp.add(新的BasicNameValuePair(“photoid”,limit.toString());
JSONObject job=jp.makeHttpRequest(“server/getfeed.php”,“POST”,lp);
尝试
{
Log.d(“json”,job.toString());
success=job.getInt(“success”);
msg=job.getString(“消息”);
如果(成功==1)
{
JSONArray ja=job.getJSONArray(“posts”);
for(int c=0;c0&&scrollState==SCROLL\u STATE\u FLING){
/***通过这种方式,我检测是否有已完成的滚动***/
/***完成加载更多日期的工作***/
if(currentFirstVisibleItem>(currentVisibleItemCount-2)和加载!=真)
{
新建GetData(photoid.execute();
}       
}
}
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
this.currentFirstVisibleItem=firstVisibleItem;
this.currentVisibleItemCount=visibleItemCount;
}  
}

加载多个图像时,使用异步任务时总是存在缓存问题。我建议使用开源库。它将加载图像并缓存。之后,快速滚动问题很可能会得到解决。
原因也可能是接收到的图像的大小。毕加索有一些方法,可以在将图像放入图像视图之前调整图像大小

@Override
public View getView(final int pos,View v,ViewGroup vg)
{   
  final eachpost post = posts.get(pos);
  final String imgurl = post.getPhotoUrl();
  String dpurl = post.getDpurl();
  int isliked = post.getIsliked();
  View row = myViews.get(pos);
  if(row == null)
  { 
   row = getActivity().getLayoutInflater().inflate(R.layout.postcontent,vg,false); 
   row.setMinimumHeight(height);
   vholder = new ViewHolder();
   vholder.handle = ((TextView) row.findViewById(R.id.handle));
   vholder.caption = ((TextView) row.findViewById(R.id.caption));
   vholder.likesnum = ((TextView) row.findViewById(R.id.likesnum));
   vholder.comnum = ((TextView) row.findViewById(R.id.comnum));
   vholder.uploadtime = ((TextView) row.findViewById(R.id.uploadtime));
   vholder.photo = (ImageView) row.findViewById(R.id.imgpost);
   vholder.feeddp = (CircularImageView) row.findViewById(R.id.realdp);
   vholder.like = (FlipImageView) row.findViewById(R.id.like);
       LayoutParams lp = vholder.photo.getLayoutParams();
   lp.width = width;
   lp.height = width;

   row.setTag(vholder); //changed here setTag()
 }else{
     vholder=(ViewHolder)row.getTag(); //changed here getTag()
 }

 vholder.handle.setText(post.getHandle());
 vholder.caption.setText(post.getCaption());
 vholder.likesnum.setText(post.getLikes()+"");
 vholder.comnum.setText(post.getComments()+"");
 vholder.uploadtime.setText(post.getUl());
 Drawable d = getResources().getDrawable(R.drawable.hook_like);
 vholder.like.setFlippedDrawable(d);
 Glide.with(getActivity()).load("server/"+imgurl).into(vholder.photo);

 if(dpurl.contains("http"))
     Glide.with(getActivity()).load(dpurl).into(vholder.feeddp);
 else
     Glide.with(getActivity()).load("server/"+dpurl).into(vholder.feeddp);
 Log.d("image loading", dpurl + "-" + imgurl);
 if(isliked==1)
      {
        vholder.like.setFlipped(true,false);
        likes.add(imgurl);
      }

 vholder.like.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         View temp = myViews.get(pos);
         final FlipImageView like = (FlipImageView) temp.findViewById(R.id.like);
         final TextView likesnum = (TextView) temp.findViewById(R.id.likesnum);
         like.toggleFlip();

         if(!likes.contains(imgurl))
            {
             posts.get(pos).incrementLikes(handle);
             likes.add(posts.get(pos).getPhotoUrl());
             likesnum.setText(posts.get(pos).getLikes()+"");
           }
         else
           {
             likes.remove(posts.get(pos).getPhotoUrl());
             posts.get(pos).decrementLikes(handle);
             likesnum.setText(posts.get(pos).getLikes()+"");
           }

     }
 });
 myViews.put(pos, row);
  }
  return row;
  }

我认为问题是因为您没有在
getView
@kishorejethava中正确使用
ViewHolder
模式,我尝试添加vholder=row.getTag()行。问题仍然存在。我将视图存储在hashmap中,没有使用视图持有者权限。但是滑动不是比毕加索更快更好吗?谢谢,但是vholder.like侦听器除了第一个列表项外工作正常。事实上,即使使用此代码,listview的行为也很奇怪。也就是说,我快速滚动like不起作用。FlipimageView不会翻转