【问题标题】:Search View for a Listview - get data from server in json format搜索列表视图的视图 - 从服务器获取 json 格式的数据
【发布时间】:2016-08-10 03:48:45
【问题描述】:

开发人员您好 :) 我是一名学生,我开始在 Android 中实现搜索视图。 我在实现搜索视图时遇到问题。我已经完成了代码,并且已经成功从服务器查看数据,

但是当我开始输入一些内容时出现错误(不幸的是已停止) EditText 中的文本(seacrh 视图)。有人会帮助我吗?给一些 请给点建议..

谢谢你..

日志错误:
进程:com.rumahkasihindonesia.kasihgroup.posrki,PID:9842 java.lang.NullPointerException:尝试调用虚拟方法 空对象上的“java.util.Iterator java.util.ArrayList.iterator()” 参考在 com.rumahkasihindonesia.kasihgroup.posrki.adapter.ItemAdapter.filter(ItemAdapter.java:116)

这是我的代码:

ItemAdapter.java

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 com.rumahkasihindonesia.kasihgroup.posrki.activity.ItemsActivity;
import com.rumahkasihindonesia.kasihgroup.posrki.model.ModelItems;
import com.rumahkasihindonesia.kasihgroup.posrki.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;

/**
 * Created by putri-pc on 6/29/2016.
 */
    public class ItemAdapter extends BaseAdapter {

    private List<ModelItems> modelItemList;
    ArrayList<HashMap<String, String>> data;
    private Context context;

    private ArrayList<ModelItems> arraylistitem;
    LayoutInflater inflater;
    ItemsActivity main;

    public ItemAdapter(ItemsActivity main)
    {
        this.main = main;
    }


    public ItemAdapter(Context context,
                        ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
        this.arraylistitem = new ArrayList<ModelItems>();
        this.arraylistitem.addAll(modelItemList);
    }


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

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

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



    static class ViewHolderItem {
        TextView nameItem;
        TextView priceItem;
        ImageView imageItem;
    }

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

        ViewHolderItem holder = new ViewHolderItem();
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) main.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_item, null);

            holder.nameItem = (TextView) convertView.findViewById(R.id.item_name);
            holder.priceItem = (TextView) convertView.findViewById(R.id.item_price);
            holder.imageItem = (ImageView) convertView.findViewById(R.id.imgItem);

            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolderItem) convertView.getTag();
        }

        holder.priceItem.setText(this.main.itemsModel.get(position).getPrice());
        holder.nameItem.setText(this.main.itemsModel.get(position).getName());
    }

    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        this.main.itemsModel.clear();
        if (charText.length() == 0) {
            this.main.itemsModel.addAll(arraylistitem);
        }
        else
        {
            for (ModelItems wp : arraylistitem)
            {
                if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText))
                {
                    this.main.itemsModel.add(wp);
                }
            }
        }
        notifyDataSetChanged();
    }

}

package com.rumahkasihindonesia.kasihgroup.posrki.activity;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.widget.SwipeRefreshLayout;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.rumahkasihindonesia.kasihgroup.posrki.R;
import com.rumahkasihindonesia.kasihgroup.posrki.adapter.ItemAdapter;
import com.rumahkasihindonesia.kasihgroup.posrki.model.ModelItems;
import com.rumahkasihindonesia.kasihgroup.posrki.service.ServiceHandler;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Locale;

public class ItemsActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    SwipeRefreshLayout swLayout;
    LinearLayout llayout;
    // URL to get contacts JSON
    private static String url = "http://10.160.1.35:84/posrkidev/web/index.php/api/inventory";

    public String idcategory;
    public String namecategory;
    public String id_mom,idItem,idCategory,idMom,name,price,active,userinsert,dateinsert,userupdate,dateupdate, pic1,pic2,categoryitem;

    final Context _context = this;
    public TextView output;

    final Context context = this;
    public ListView list;
    public ArrayList<ModelItems> itemsModel = new ArrayList<ModelItems>();
    public ItemAdapter adapter;

    private ModelItems itemModel;
    ProgressDialog pDialog;
    EditText inputSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_items);

        //JSON
        if(android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        //LISTVIEW
        list = (ListView) findViewById(R.id.listItems);
        adapter = new ItemAdapter(this);
        list.setAdapter(adapter);

        //
        inputSearch = (EditText) findViewById(R.id.inputSearch);

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONArray jsonarray = new JSONArray(jsonStr);
                for (int i = 0; i < jsonarray.length(); i++) {
                    final JSONObject jsonobject = jsonarray.getJSONObject(i);

                    idItem = jsonobject.getString("ID_Item");
                    idCategory = jsonobject.getString("Item_Name");
                    idMom = jsonobject.getString("ID_Mom");
                    name = jsonobject.getString("Item_Price");
                    categoryitem = jsonobject.getString("ID_Inv_Category");
                    pic1 = jsonobject.getString("Item_PIC1");
                    pic2 = jsonobject.getString("Item_PIC2");
                    price = jsonobject.getString("Item_active");
                    userinsert = jsonobject.getString("insert_user");
                    dateinsert = jsonobject.getString("insert_date");
                    userupdate = jsonobject.getString("update_user");
                    dateupdate = jsonobject.getString("update_date");

                    ModelItems add=new ModelItems();
                    add.setId(jsonobject.getString("ID_Item"));
                    add.setName(jsonobject.getString("Item_Name"));
                    add.setIdMom(jsonobject.getString("ID_Mom"));
                    add.setPrice(jsonobject.getString("Item_Price"));
                    add.setActive(jsonobject.getString("Item_active"));
                    add.setPic1(jsonobject.getString("Item_PIC1"));
                    add.setPic2(jsonobject.getString("Item_PIC2"));
                    add.setIdCategory(jsonobject.getString("ID_Inv_Category"));
                    add.setInsert_user(jsonobject.getString("insert_user"));
                    add.setInsert_date(jsonobject.getString("insert_date"));
                    add.setUpdate_user(jsonobject.getString("update_user"));
                    add.setUpdate_date(jsonobject.getString("update_date"));

                    itemsModel.add(add);
                }
                adapter.notifyDataSetChanged();
            } catch (JSONException e) {
                e.printStackTrace();
            }

        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        /**
         * Enabling Search Filter
         * */
        inputSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                adapter.filter(text);
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                                          int arg2, int arg3) {
                // TODO Auto-generated method stub
            }

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
                // TODO Auto-generated method stub
            }
        });

        // Inisialisasi SwipeRefreshLayout
        swLayout = (SwipeRefreshLayout) findViewById(R.id.swlayout);

        llayout = (LinearLayout) findViewById(R.id.ll_swiperefresh);
        swLayout.setColorSchemeResources(R.color.colorAccent,R.color.colorPrimary);
        swLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

                // Handler untuk menjalankan jeda selama 5 detik
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        // Berhenti berputar/refreshing
                        swLayout.setRefreshing(false);
                        Intent intent = new Intent(ItemsActivity.this, ItemsActivity.class);
                        startActivity(intent);
                    }
                }, 1000);
            }
        });

    }

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(ItemsActivity.this, MasterDataActivity.class);
        startActivity(intent);
    }

}

【问题讨论】:

    标签: android json listview adapter searchview


    【解决方案1】:

    此适配器有 2 个公共构造函数。您在 adapter = new ItemAdapter(this); 行上使用 ItemsActivity 中的第一个。此构造函数不会初始化 ItemAdapter 中的字段 arraylistitem,这就是您的应用在尝试访问 arraylistitem 时崩溃的原因。您可以在第一个构造函数中重复 this.arraylistitem = new ArrayList&lt;ModelItems&gt;(); 行来解决此问题,或使用第二个构造函数。

    【讨论】:

    • 好吧,@prfarlow 先生。我在 ItemsActivity 中调用方法 filter(string)。爪哇。我在我的问题中添加了 ItemsActivity.java 的代码。谢谢。
    • 先生,我用这个方法把arraylistitem改成this.main.itemsModel
    • public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); this.main.itemsModel.clear(); if (charText.length() == 0) { this.main.itemsModel.addAll(main.itemsModel); } else { for (ModelItems wp : main.itemsModel) { if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText)) { this.main.itemsModel.add(wp); } } } notifyDataSetChanged(); }
    • 我没有收到错误,但是当我开始输入文本时,即使我输入了真实的文本,我也没有得到 listView 视图。有人能告诉我哪里错了吗?
    【解决方案2】:

    我认为您必须在 onTextChanged 中编写代码,如下所示:

    String text = arg0;
                adapter.filter(text);
    

    【讨论】:

    • 谢谢你回答我@android-developer,但我已经在onTextChanged中写了,但它必须是这样的:String text = (String) arg0; adapter.filter(text);我得到了错误。我尝试将此 :String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault()); adapter.filter(text); 添加到 onTextChanged ,但列表视图为空白..我该如何继续此代码,请帮助..
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多