BaseAdapter 未更新列表视图中的数据

Posted

技术标签:

【中文标题】BaseAdapter 未更新列表视图中的数据【英文标题】:BaseAdapter is not updating data in listview 【发布时间】:2015-11-12 10:01:04 【问题描述】:

我正在尝试通过BaseAdapter 获取Arraylist<Hashmap<String, String>,但BaseAdapter 仅显示ListView 中的第一个元素,这意味着它没有在`ListView 中显示完整的Arraylist

这是我的列表视图 xml Rating_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:background="#ffffff" >

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:gravity="center"
        android:padding="15dp"
        android:text="text"
        android:textColor="#6eb5c4"
        android:textStyle="bold" />

</LinearLayout>

</LinearLayout>

这是 Rating_layout.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >



<include
    android:id="@+id/custom_top"
    android:layout_
    android:layout_
    layout="@layout/action_bar_popup" />

<LinearLayout
    android:layout_
    android:layout_
    android:background="@drawable/new_background"
    android:orientation="horizontal" >

    <ListView
        android:id="@+id/listView1"
        android:layout_
        android:layout_
        android:layout_margin="20dp"
        android:layout_weight="0.38"
        android:divider="#000000"
        android:dividerHeight="1dp" >
    </ListView>

</LinearLayout>

</LinearLayout>

这是我用来设置CustomAdapter的方法

 protected void Rating_info() 
    pop_pref = getSharedPreferences("rating_info", MODE_PRIVATE);
    flag = pop_pref.getString("flag", null);
    size = pop_pref.getInt("a",0);


    for (int i = 0; i<=(size-1);i++)

        app_detail.put("provider_name",pop_pref.getString("key"+i, null));
        System.out.println("in for loop "+pop_pref.getString("key"+1, null));
    
//  provider_name = pop_pref.getString("provider_name", null);
    applist.add(app_detail);

if(flag.equalsIgnoreCase("-1"))

        popup_dialog = new Dialog(Home_Screen.this);
        popup_dialog.setContentView(R.layout.rating_layout);
        popup_dialog.getWindow().setBackgroundDrawable(
                new ColorDrawable(android.graphics.Color.TRANSPARENT));
        popup_dialog.setCancelable(true);
        //final View view = popup_dialog.findViewById(R.id.custom_top);
        TextView tv1 = (TextView)popup_dialog.findViewById(R.id.textView1);
    //  RatingBar rb = (RatingBar)popup_dialog.findViewById(R.id.popup_ratingbar);
    //  ImageView close = (ImageView)popup_dialog.findViewById(R.id.close);
        tv1.setText("Give Rating");
    //  rb.setRating(Float.parseFloat("2.0"));
        ListView lv = (ListView) popup_dialog.findViewById(R.id.listView1);
        ImageView close = (ImageView)popup_dialog.findViewById(R.id.close);
        Custum_Adapter adapter = new Custum_Adapter(Home_Screen.this, applist);
        lv.setAdapter(adapter);

    


这是我的自定义适配器

private class Custum_Adapter extends BaseAdapter 
     ArrayList<HashMap<String, String>> list;

     public Custum_Adapter(Context context, ArrayList<HashMap<String, String>> applist) 
            this.list = applist;
        


    @Override
    public int getCount() 
        return list.size();
    

    @Override
    public Object getItem(int position) 
        return list.get(position);
    

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

        if (convertView == null) 
            convertView = LayoutInflater.from(getApplicationContext())
                    .inflate(R.layout.rating_list, parent, false);
        
        System.out.println("list size*******"+list.size());


        HashMap<String, String> a = list.get(position);
        System.out.println("Position of hash map----->"+position);
    //  String id = a.get("id");
        String name = a.get("provider_name");
        System.out.println("name--------->"+name);
    //  String c_cost = a.get("cost");
    //  String c_id = a.get("cost_id");
        TextView tv = (TextView) convertView.findViewById(R.id.textView1);
    //  TextView tv1 = (TextView) convertView.findViewById(R.id.textView2);
    //  TextView tv2 = (TextView) convertView.findViewById(R.id.costing_id);
    //  TextView tv3 = (TextView) convertView.findViewById(R.id.cost);
        tv.setText(name);
    //  tv1.setText(id);
    //  tv2.setText(c_id);
    //  tv3.setText(c_cost);

        return convertView;
    

但它只显示列表中的一个项目,尽管我发送了一个包含五个项目的列表。

【问题讨论】:

您只在数组列表中添加了一项。这就是为什么。检查您的代码... 【参考方案1】:

那么为什么它没有在列表视图中显示所有五个项目。

因为在 for 循环的每次迭代中,您都会覆盖您实例化的唯一 HashMap 的值,并仅在循环结束时将其添加到 ArrayList 中。类似的东西

for (int i = 0; i< size ;i++)
    app_detail = new HashMap<>();
    app_detail.put("provider_name",pop_pref.getString("key"+i, null));
    System.out.println("in for loop "+pop_pref.getString("key"+1, null));
    applist.add(app_detail); 

应该这样做

【讨论】:

【参考方案2】:

当您执行此操作时,您返回数组列表的大小为 1,因为数组列表仅包含哈希图。因此适配器认为您只有一个要显示的项目。您应该从数组列表中返回哈希图的大小。对所有其他方法执行相同操作。

 @Override
    public int getCount() 
        return list.size();
    

解决方案:

@Override
        public int getCount() 
            return list.get(0).size();
        

【讨论】:

以上是关于BaseAdapter 未更新列表视图中的数据的主要内容,如果未能解决你的问题,请参考以下文章

Listview BaseAdapter 数据未显示

使用 Baseadapter 时列表视图中的联系人图像重复

Android BaseAdapter:位置不是真正的位置?

如何使用 baseadapter 自定义列表视图

带有 BaseAdapter 的 ListView

如何在android中使用baseadapter刷新自定义列表视图