Java 搜索ListView(Android)的问题

Java 搜索ListView(Android)的问题,java,android,listview,Java,Android,Listview,我一直很难让我的搜索框在Listview中搜索合适的行,然后根据需要显示 基本上,当我在搜索框中键入时,要么应用程序崩溃,要么从各种文件(ListView.java、TextView.java等)中给我“null object reference”错误 我怀疑这与比较EditText和从JSON值创建的数组之间的字符串缺乏经验有很大关系。显示listview很好,搜索它是一个令人沮丧的障碍。非常感谢您的帮助,谢谢 我的代码部分如下: ListViewActivity.java package c

我一直很难让我的搜索框在Listview中搜索合适的行,然后根据需要显示

基本上,当我在搜索框中键入时,要么应用程序崩溃,要么从各种文件(ListView.java、TextView.java等)中给我“null object reference”错误

我怀疑这与比较EditText和从JSON值创建的数组之间的字符串缺乏经验有很大关系。显示listview很好,搜索它是一个令人沮丧的障碍。非常感谢您的帮助,谢谢

我的代码部分如下:

ListViewActivity.java

package com.example.myapplication;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.util.Log;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import com.example.myapplication.WaterWellRigsJsonUrl;
import com.example.myapplication.Rig;

public class ListViewActivity extends Activity {

private ListView listview;
private ArrayList<Rig> Rigs;
private ArrayList<Rig> RigsTemp;
private ArrayAdapter<Rig> adapter;
private ArrayAdapter<Rig> adapter2;
private EditText et;
String searchString = "";

private final static String TAG = ListViewActivity.class.getSimpleName();
private final static String url = "http://www.world-rigs.com/waterwellrigs/json.php";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listview);

    listview = (ListView) findViewById(R.id.listview);

    setListViewAdapter();
    getDataFromInternet();

    final EditText myFilter = (EditText) findViewById(R.id.myFilter);
    myFilter.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //adapter.getFilter().filter(s);
            String searchString = s.toString();
            if (s.length() > 0) {
                for (int i = 0; i < Rigs.size();i++) {
                    if (searchString.equalsIgnoreCase(Rigs.get(i).getName())) {
                        Rig rigtemp = new Rig();
                        rigtemp.setName(Rigs.get(i).getName());
                        rigtemp.setImageUrl(Rigs.get(i).getImageUrl());
                        rigtemp.setRigId(Rigs.get(i).getRigId());
                        RigsTemp.add(rigtemp);
                        Log.e("myTag2", "value:" + RigsTemp.size());
                    }
                }
            }
    adapter2 = new CustomListViewAdapter(ListViewActivity.this, R.layout.item_listview, RigsTemp);
    listview.setAdapter(adapter2);
        }

    });
}

private void getDataFromInternet() {
    new WaterWellRigsJsonUrl(this, url).execute();
}

private void setListViewAdapter() {
    Rigs = new ArrayList<Rig>();
    adapter = new CustomListViewAdapter(this, R.layout.item_listview, Rigs);
    listview.setAdapter(adapter);

    listview.setTextFilterEnabled(true);
}

//parse response data after asynctask finished
public void parseJsonResponse(String result) {
    Log.i(TAG, result);
    try {
        JSONObject json = new JSONObject(result);
        JSONArray jArray = new JSONArray(json.getString("rig_array"));
        for (int i = 0; i < jArray.length(); i++) {

            JSONObject jObject = jArray.getJSONObject(i);
            Rig rig = new Rig();
            rig.setName(jObject.getString("name"));
            rig.setImageUrl(jObject.getString("image"));
            rig.setRigId(jObject.getString("rigid"));
            Rigs.add(rig);
            Log.e("myTag", Rigs.get(i).getRigId());
        }

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

}
package com.example.myapplication;

import java.util.List;

import android.app.Activity;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.myapplication.Rig;
import com.loopj.android.image.SmartImageView;
import com.squareup.picasso.Picasso;

public class CustomListViewAdapter extends ArrayAdapter<Rig> {

private Activity activity;

public CustomListViewAdapter(Activity activity, int resource, List<Rig> rigs) {
    super(activity, resource, rigs);
    this.activity = activity;

}

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

    ViewHolder holder = null;
    LayoutInflater inflater = (LayoutInflater) activity
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    // If holder not exist then locate all view from UI file.
    if (convertView == null) {
        // inflate UI from XML file
        convertView = inflater.inflate(R.layout.item_listview, parent, false);
        // get all UI view
        holder = new ViewHolder(convertView);
        // set tag for holder
        convertView.setTag(holder);
    } else {
        // if holder created, get tag from view
        holder = (ViewHolder) convertView.getTag();
    }

    Rig rig = getItem(position);

    holder.name.setText(rig.getName());
    holder.authorName.setText("WR" + rig.getRigId());
    Picasso.with(activity).load(rig.getImageUrl()).into(holder.image);

    return convertView;
}

private static class ViewHolder {
    private TextView name;
    private TextView authorName;
    private ImageView image;

    public ViewHolder(View v) {
        name = (TextView) v.findViewById(R.id.title);
        image = (SmartImageView) v.findViewById(R.id.thumbnail);
       // SmartImageView image = (SmartImageView) v.findViewById(R.id.my_image);
        authorName = (TextView) v.findViewById(R.id.author);
    }
 }

}

您不需要创建两个适配器并反复初始化它们。只创建一个适配器,并使用
notifyDataSetChanged
更改数据并更新
ListView

private ArrayList<Rig> RigsTemp;
private ArrayAdapter<Rig> adapter;
private ArrayList RigsTemp;
专用阵列适配器;
按如下方式更改您的功能:

private void setListViewAdapter() {
    Rigs = new ArrayList<Rig>();
    RigsTemp = new ArrayList<Rig>();
    adapter = new CustomListViewAdapter(ListViewActivity.this, R.layout.item_listview, RigsTemp);
    listview.setAdapter(adapter);
    listview.setTextFilterEnabled(true);
}
private void setListViewAdapter(){
Rigs=新的ArrayList();
RigsTemp=newarraylist();
adapter=新的CustomListViewAdapter(ListViewActivity.this,R.layout.item\u listview,RigsTemp);
setAdapter(适配器);
setTextFilterEnabled(true);
}
并将TextWatcher代码更改为以下代码:

public void onTextChanged(CharSequence s, int start, int before, int count) {
    String searchString = myFilter.getText().toString();
    RigsTemp.clear();
    if (s.length() > 0) {
        for (int i = 0; i < Rigs.size(); i++) {
            if (searchString.equalsIgnoreCase(Rigs.get(i).getName())) {
                    Rig rigtemp = new Rig();
                    rigtemp.setName(Rigs.get(i).getName());
                    rigtemp.setImageUrl(Rigs.get(i).getImageUrl());
                    rigtemp.setRigId(Rigs.get(i).getRigId());
                    RigsTemp.add(rigtemp);
                }
            }
    } else {
        // Only if you want to show all results when user has not entered anything in EditText
        // Else remove this line to show empty ListView at start
        RigsTemp.addAll(Rigs);
    }
    adapter.notifyDataSetChanged();
}
public void onTextChanged(字符序列、int start、int before、int count){
String searchString=myFilter.getText().toString();
RigsTemp.clear();
如果(s.长度()>0){
对于(int i=0;i
您忘记初始化
RigsTemp
arrayi建议在适配器中实现可过滤接口Hello Rehan,感谢您的回复。我尝试过你的解决方案,但仍然不起作用,所以我尝试使用日志打印和Logct来检查文本框。事实上,问题似乎是equalsIgnoreCase,它似乎不起作用。在解决有关此函数的错误方面有任何帮助或经验吗?您好,Rehan,对不起,代码确实有效。谢谢你的指导@我已经更新了答案。您可以更改
String searchString=s.toString()
to
String searchString=myFilter.getText().toString()
因此它将使用EditText中输入的所有文本进行搜索。@AjitDenis如果对您有效,请接受答案:)你好,Rehan,是的,答案已接受。我也不知道。contains函数,这正是我要找的。
public void onTextChanged(CharSequence s, int start, int before, int count) {
    String searchString = myFilter.getText().toString();
    RigsTemp.clear();
    if (s.length() > 0) {
        for (int i = 0; i < Rigs.size(); i++) {
            if (searchString.equalsIgnoreCase(Rigs.get(i).getName())) {
                    Rig rigtemp = new Rig();
                    rigtemp.setName(Rigs.get(i).getName());
                    rigtemp.setImageUrl(Rigs.get(i).getImageUrl());
                    rigtemp.setRigId(Rigs.get(i).getRigId());
                    RigsTemp.add(rigtemp);
                }
            }
    } else {
        // Only if you want to show all results when user has not entered anything in EditText
        // Else remove this line to show empty ListView at start
        RigsTemp.addAll(Rigs);
    }
    adapter.notifyDataSetChanged();
}