【问题标题】:TexView not updating in Custom ListViewTexView 未在自定义 ListView 中更新
【发布时间】:2017-08-13 03:41:16
【问题描述】:

在我的应用中,用户按下一个按钮来获得积分,然后他们使用该分数来购买升级。在此列表视图中,用户购买了升级,我想显示他们购买的升级数量。

final ArrayList<HashMap<String, String>>  authorList = new ArrayList<>();


    //Setup adapter
    customListViewAdapter = new CustomListViewAdapter(getApplicationContext(), authorList);
    listView.setAdapter(customListViewAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            firstoption = position;


        }
    });
    if (firstoption == 0) {
        nigg++;
        str = Integer.toString(nigg);
        bookPages[firstoption] = str;
    }
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {


                HashMap<String, String> data = new HashMap<>();
                data.put("title", bookTitles[i]);
                data.put("pages", bookPages[i]);
                data.put("author", authors[i]);


                authorList.add(data);
            }
            handler.postDelayed(this, 1000);
        }
    }, 1000);

这是我现在拥有的代码,但由于某种原因它没有更新。我做错了什么?

CustomListView 类

package com.example.navjeevenmann.mytycoon;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


import java.util.ArrayList;
import java.util.HashMap;


public class CustomListViewAdapter extends BaseAdapter {

private Context mContext;
private ArrayList<HashMap<String, String>> books;
private static LayoutInflater inflater = null;


public CustomListViewAdapter(Context context, ArrayList<HashMap<String, String>> data) {

    mContext = context;
    books = data;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}


@Override
public int getCount() {
    return books.size();
}

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

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

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

    View view = convertView;

    if (convertView == null) {

        view = inflater.inflate(R.layout.program_list, null);

        TextView title = (TextView) view.findViewById(R.id.title);
        TextView author = (TextView) view.findViewById(R.id.textView);
        TextView pages = (TextView) view.findViewById(R.id.pages);
        ImageView image = (ImageView) view.findViewById(R.id.list_image);

        HashMap<String, String> mBook = new HashMap<>();



        title.setText(mBook.get("title"));
        author.setText(mBook.get("author"));
        pages.setText(mBook.get("pages"));


    }


    return view;
}
}

【问题讨论】:

  • 显示自定义列表视图类
  • @Salman500 添加

标签: android listview


【解决方案1】:

您能否更改 AdapterClass 的 getView() 方法。在 textview 上设置文本之前结束 ur if 条件

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

    View view = convertView;

    if (convertView == null) {

        view = inflater.inflate(R.layout.program_list, null);

        TextView title = (TextView) view.findViewById(R.id.title);
        TextView author = (TextView) view.findViewById(R.id.textView);
        TextView pages = (TextView) view.findViewById(R.id.pages);
        ImageView image = (ImageView) view.findViewById(R.id.list_image);



}
        title.setText(mBook.get("title"));
        author.setText(mBook.get("author"));
        pages.setText(mBook.get("pages"));





    return view;
}
}

关于如何向适配器发送数据,只需像这样在你的代码中进行更改...在 arraylist 中设置值后设置适配器

final ArrayList<HashMap<String, String>>  authorList = new ArrayList<>();


handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {


                HashMap<String, String> data = new HashMap<>();
                data.put("title", bookTitles[i]);
                data.put("pages", bookPages[i]);
                data.put("author", authors[i]);


                authorList.add(data);
            }
            handler.postDelayed(this, 1000);
        }
    }, 1000);

    //Setup adapter
    customListViewAdapter = new CustomListViewAdapter(getApplicationContext(), authorList);
    listView.setAdapter(customListViewAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            firstoption = position;


        }
    });
    if (firstoption == 0) {
        nigg++;
        str = Integer.toString(nigg);
        bookPages[firstoption] = str;
    }

希望这会帮助你...如果不是请告诉我

【讨论】:

  • 嘿伙计,你确定这会起作用吗?通过将文本视图设置器放在 getView 之外,它甚至不应该编译。它也没有遵循每个 android 文档应该如何使用 getView()。
  • 不在 getview() 之外放在 if 条件之外,并且不要在 if 条件下再次初始化哈希映射...这应该可以工作
  • @Bqin1 不要放在 getview() 之外,只是放在 if(convertview==null){} 条件之外......并且不要在 getView() 中再次初始化你的哈希映射跨度>
【解决方案2】:

不要使用

View view = convertView;

因为你的 convertView 是空的,所以这样做

View view = inflater.inflate(R.layout.your_layout,parent,false);

HashMap<String, String> mBook = authorList.get(position);
text.setText(mBook.get("your_key");

【讨论】:

    【解决方案3】:

    这是问题:

    HashMap<String, String> mBook = new HashMap<>();
    

    这始终是空的,因为每次调用 getView 时都会将 mBook 重新初始化为空,本质上是在每次填充后重置数据结构。

    您已经将主类中的数据 HashMap 作为 HashMap 的“书籍”列表传递给您的列表。只需在 mBooks 声明之后添加它

    mBooks = books.get(position);
    

    另外请阅读 listview/arrayadapter 如何工作here

    您没有用数据填充 HashMap 也可能是个问题。在这里做一些调试

    Data.put("title", bookTitles[i]);
    System.out.println(bookTitles[i]);
    

    如果您打印了任何东西,请告诉我。

    【讨论】:

    • 你能具体说明我对HashMap不完全熟悉的方式
    • 我更新了我的答案,基本上你没有初始化 mBooks。另外,如果你不知道 HashMap,你真的应该在这里查一下 docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
    • 我把它放在customlistview适配器类中,对吧
    • 是的,告诉我进展如何。如果它对您有用,请投票或接受答案。所以其他人也可以知道。
    • 不,它仍然不起作用。它不会保持文本视图更新
    【解决方案4】:

    问题是您正在向 authorList 添加数据但没有通知适配器。 因此,当添加数据时,内部处理程序只需通知适配器,以便适​​配器可以更新..

    handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10; i++) {
    
    
                        HashMap<String, String> data = new HashMap<>();
                        data.put("title", bookTitles[i]);
                        data.put("pages", bookPages[i]);
                        data.put("author", authors[i]);
    
    
                        authorList.add(data);
                        customListViewAdapter.notifyDataSetChanged();
    
                    }
                    handler.postDelayed(this, 1000);
                }
            }, 1000);
    

    希望它会起作用。

    【讨论】:

    • 在 getView() 里面做这样的事情.. HashMap mBook = new HashMap();
    【解决方案5】:
    1. 如下更改getView代码。
    2. 添加 ViewHolder 以获得更好的性能。

      public class CustomListViewAdapter extends BaseAdapter {
          private Context mContext;
          private ArrayList<HashMap<String, String>> books;
          private static LayoutInflater inflater = null;
          private ViewHolder mHolder;
      
         public CustomListViewAdapter(Context context, ArrayList<HashMap<String, String>> data) {
      
         mContext = context;
         books = data;
         inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      
         }
      
      
        @Override
        public int getCount() {
          return books.size();
        }
      
        @Override
        public Object getItem(int position) {
           return position;
        }
      
        @Override
        public long getItemId(int position) {
          return position;
        }
      
        static class ViewHolder {
          TextView title;
          TextView author;
          TextView pages;
          ImageView image;
        }
      
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
      
          View view = convertView;
      
          if (convertView == null) {
      
              view = inflater.inflate(R.layout.program_list, null);
              mHolder = new ViewHolder();
              mHolder.title = (TextView) view.findViewById(R.id.title);
              mHolder.author = (TextView) view.findViewById(R.id.textView);
              mHolder.pages = (TextView) view.findViewById(R.id.pages);
              mHolder.image = (ImageView) view.findViewById(R.id.list_image);
              convertView.setTag(mHolder);
          } else {
              mHolder = (ViewHolder) convertView.getTag();
          }
          HashMap<String, String> mBook = books.get(position);
          title.setText(mBook.get("title"));
          author.setText(mBook.get("author"));
          pages.setText(mBook.get("pages"));
          return view;
       }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多