【问题标题】:Custom Listview in Android repeating same itemAndroid中的自定义Listview重复相同的项目
【发布时间】:2015-07-21 23:51:19
【问题描述】:

我在 android 中有一个自定义 ArrayAdapter 用于填充我的自定义 ListView。但是,只有最后一项显示在我的 ListView 上,并且从第一项迭代到最后一项(我的数组中的最后一项在 listview 中显示 x 次,其中 x 是数组中的项数)。我曾尝试寻找答案,但这些地址回收视图使列表视图重复前几项。但是我的从头到尾重复最后一项。我在那里尝试了这些建议,但我的代码仍然运行相同。数组内容很好,因为正确的内容会打印在日志中。任何帮助表示赞赏。这是我的代码

    public class VideoQueueAdapter extends BaseAdapter implements View.OnClickListener {
/*********** Declare Used Variables *********/
private Activity activity;
private ArrayList data;
private static LayoutInflater inflater=null;
public Resources res;
VideoListModel vid_list_item=null;
int i=0;
private Context context;

/*************  CustomAdapter Constructor *****************/
public VideoQueueAdapter(Activity a, ArrayList d,Resources resLocal) {
    this.context = context;
    /********** Take passed val0ues **********/
    activity = a;
    data=d;
   res = resLocal;
    context = activity.getApplicationContext();
    /***********  Layout inflator to call external xml layout () **********************/
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

/******** What is the size of Passed Arraylist Size ************/
public int getCount() {

    if(data.size()<=0)
        return 1;
    return data.size();
}

public Object getItem(int position) {
    return position;
}

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

/********* Create a holder to contain inflated xml file elements ***********/
public static class ViewHolder{

    public TextView title;
    public TextView url;
    public TextView deadline;
    public TextView id;
    public ImageView thumbnail;

}

/*********** Depends upon data size called for each row , Create each ListView row ***********/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    ViewHolder holder;

    if(vi==null){

        /********** Inflate tabitem.xml file for each row ( Defined below ) ************/
        vi = inflater.inflate(R.layout.activity_video_item, null);

        /******** View Holder Object to contain tabitem.xml file elements ************/
        holder=new ViewHolder();

    }
    else{  holder=(ViewHolder)vi.getTag();}
    holder.thumbnail = (ImageView)vi.findViewById(R.id.vid_thumb);
    holder.title = (TextView)vi.findViewById(R.id.vid_title);
    holder.url = (TextView)vi.findViewById(R.id.vid_url);
    holder.deadline = (TextView)vi.findViewById(R.id.item_timeout);
    holder.id = (TextView)vi.findViewById(R.id.item_id);

    /************  Set holder with LayoutInflater ************/
    vi.setTag(holder);
    if(data.size()<=0)
    {
        holder.title.setText("No Data");

    }
    else
    {
        /***** Get each Model object from Arraylist ********/
        vid_list_item=null;
        vid_list_item = (VideoListModel) data.get(position);

        /************  Set Model values in Holder elements ***********/
        String title = "";

        String img = vid_list_item.getUrl();
        img = "http://img.youtube.com/vi/"+ img+ "/0.jpg";
        Picasso.with(context).load(img).resize(115, 115).into(holder.thumbnail);

        holder.title.setText(vid_list_item.getTitle());
        holder.url.setText(vid_list_item.getUrl());
        holder.deadline.setText(vid_list_item.getTimeout());
        holder.id.setText(vid_list_item.getId());
        /******** Set Item Click Listner for LayoutInflater for each row ***********/
        vi.setOnClickListener(new OnItemClickListener(position));
    }
    return vi;
}

@Override
public void onClick(View v) {
    Log.v("CustomAdapter", "=====Row button clicked");
}

/********* Called when Item click in ListView ************/
private class OnItemClickListener  implements View.OnClickListener {
    private int mPosition;

    OnItemClickListener(int position){
        mPosition = position;
    }

    @Override
    public void onClick(View arg0) {
       // CustomListViewAndroidExample sct = (CustomListViewAndroidExample)activity;
       // sct.onItemClick(mPosition);

    }
}



}

【问题讨论】:

  • @Nam hoang 你建议的 url 让我重新思考我的代码,发现问题出在构造数组上。我将数组的代码检查内容放在错误的位置,让我相信它是正确的。显然我的问题是在填充我的数组列表的循环之外构建临时对象。这个link 显示了我的问题所在。感谢那些回答的人

标签: android listview android-listview


【解决方案1】:

我认为使用viewholder的正确方法是这样的

 if(vi==null){

    /********** Inflate tabitem.xml file for each row ( Defined below ) ************/
    vi = inflater.inflate(R.layout.activity_video_item, null);

    /******** View Holder Object to contain tabitem.xml file elements ************/
    holder=new ViewHolder();
    holder.thumbnail = (ImageView)vi.findViewById(R.id.vid_thumb);
    holder.title = (TextView)vi.findViewById(R.id.vid_title);
    holder.url = (TextView)vi.findViewById(R.id.vid_url);
    holder.deadline = (TextView)vi.findViewById(R.id.item_timeout);
    holder.id = (TextView)vi.findViewById(R.id.item_id);
}
else{  holder=(ViewHolder)vi.getTag();}

试试这个,也许它可以解决你的问题

【讨论】:

  • 我忘了说你的建议是原始代码。一些关于重复的帖子建议将所有内容放在 holder = new Viewholder(); 之后在外部的 if 块中,就像代码中的内容一样。不过并没有真正改变什么
【解决方案2】:

除了上面的答案,还要确保你已经受到了影响

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

在您的适配器中。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多