【问题标题】:Update ListView is not working更新 ListView 不起作用
【发布时间】:2015-12-25 17:52:32
【问题描述】:

我有一个包含项目的列表视图。当我使用 AutoCompleteTextView 进行搜索时,新项目会添加到列表视图中,但是当我单击 onItemClick 时,它会获得旧位置。我可以在新的列表视图中获得位置吗?

public interface MyClickListener {
    public void click(SanPham sanPham);
}

@Override
public View onCreateView(LayoutInflater inflater,
                         @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_fragment, null);
    sanPhams = new ArrayList<SanPham>();
    SanPham sanPham0 = new SanPham("Coca Cola", "Giá: 165.000/thùng",
            R.drawable.flag_coca, 1,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "Coca Cola. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham1 = new SanPham("Pepsi", "Giá: 165.000/thùng",
            R.drawable.flag_pepsi, 1,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "pepsi. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham2 = new SanPham("suafami", "Giá: 165.000/thùng",
            R.drawable.flag_suafami, 2,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "suafami. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham3 = new SanPham("7up", "Giá: 165.000/thùng",
            R.drawable.flag_7up, 1,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "7up. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham4 = new SanPham("number1", "Giá: 165.000/thùng",
            R.drawable.flag_number1, 1,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "number1. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham5 = new SanPham("nuocepdau", "Giá: 165.000/thùng",
            R.drawable.flag_nuocepdau, 2,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "nuocepdau. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham6 = new SanPham("sting", "Giá: 165.000/thùng",
            R.drawable.flag_sting, 1,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "sting. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");
    SanPham sanPham7 = new SanPham("traxanh0do", "Giá: 165.000/thùng",
            R.drawable.flag_traxanh0do, 1,
            "Bảo hành: 12 tháng. \r\n Nguồn gốc: Chính hãng. \r\n Hãng sản xuất:" +
                    "traxanh0do. \r\n Dung Tích(ml)/Lon: 330. \r\n Xuất xứ: Việt Nam");

    sanPhams.add(sanPham0);
    sanPhams.add(sanPham1);
    sanPhams.add(sanPham2);
    sanPhams.add(sanPham3);
    sanPhams.add(sanPham4);
    sanPhams.add(sanPham5);
    sanPhams.add(sanPham6);
    sanPhams.add(sanPham7);

    listView = (ListView) view.findViewById(R.id.listView1);
    adapterListView =new AdapterListView(getActivity(), sanPhams);
    listView.setAdapter(adapterListView);

    AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) view.findViewById(R.id.AutoCompleteTextView1);
    String[] data = new String[]{"Coca Cola", "Pepsi", "suafami", "7up", "number1", "nuocepdau", "sting", "traxanh0do"};
    ArrayAdapter<String> aa = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, data);
    autoCompleteTextView.setAdapter(aa);
    autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ArrayList<SanPham> rs = new ArrayList<>();
            for (int i = 0; i < sanPhams.size(); i++) {
                if (sanPhams.get(i).getName() == (((TextView) view).getText())) {
                    rs.add(sanPhams.get(i));
                }
            }

            listView.setAdapter(new AdapterListView(getActivity(), rs));

        }
    });
    final ArrayAdapter<String> arrayAdapterSpiner = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, new String[]{"Tất cả",
            "Nước Có Ga", "Nước Không Có Ga"});
    Spinner spinner = (Spinner) view.findViewById(R.id.Spiner1);
    spinner.setAdapter(arrayAdapterSpiner);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            ArrayList<SanPham> rs = new ArrayList<>();
            if (position == 0)
                rs = sanPhams;
            else {
                for (int i = 0; i < sanPhams.size(); i++) {
                    if (sanPhams.get(i).getType() == position) {
                        rs.add(sanPhams.get(i));

                    }
                }
            }
            listView.setAdapter(new AdapterListView(getActivity(), rs));
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
    textView = (TextView) view.findViewById(R.id.textView1);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            if (textView == null) {
                clickListener = (MyClickListener) getActivity();
                clickListener.click(sanPhams.get(position));
            } else {
                textView.setText(sanPhams.get(position).getDescription() + "");
            }
        }
    });

    return view;

}

【问题讨论】:

  • 据我了解,您每次使用AutoCompleteTextView 时都会创建一个新的AdapterListView,对吗?

标签: android android-listview


【解决方案1】:

先确定

您在此处以错误的方式比较 if (sanPhams.get(i).getName() == (((TextView) view).getText())) 中的两个 Strings,您应该将其更改为 if (sanPhams.get(i).getName().equals((TextView) view).getText()),因为这就是您比较 Strings 中的方式强>Java。


其次

我希望你更改 AdapterListViewDataset(content) 而不是一起构建一个新的,你可以保留一个 reference 到你的 AdapterListView 然后用您的新数据重新填充它。


以下是实现此目的的方法:

    //Define your adapter variable
private AdapterListView myAdapterListView = null;
...
//Your Adapter initialization 
listView = (ListView) view.findViewById(R.id.listView1);
adapterListView =new AdapterListView(getActivity(), sanPhams);
listView.setAdapter(adapterListView);
...

现在取决于你的AdapterListView 实现,我猜你有某种ArrayList 在你的构造函数中添加你的数据,就像这里new AdapterListView(getActivity(), rs) 这样你可以在你的@987654330 中创建一个方法@ 称为填充,它将向您现有的适配器添加一个新的 ArrayList

//Add this method in your adapter
public void populate(ArrayList newData){
  //your adapter arrayList
  this.YOUR_ADAPTER_ARRAYLSIT = newData;
  //this will refresh your adapter with the new data
  this.notifyDataSetChanged(); 
}

然后你只需调用 //Repopulate your adapter this.adapterListView.populate(rs)

而不是这个

listView.setAdapter(new AdapterListView(getActivity(), rs));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多