Android的解析JSON数据,并添加搜索功能 [英] Android parsed json data and add a search functionality

查看:162
本文介绍了Android的解析JSON数据,并添加搜索功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对不起,我的坏english.I是新来的Andr​​oid和我解析JSON数据到列表视图,现在我想要把他的搜索功能,但我有一个问题,当我进入了一个的EditText的话,那么在我的ListView项目被复制,并且项目已经增加,我看code和屏幕shots.Thanks提前任何帮助将非常AP preciated。

Sorry for my bad english.I am new to android and i parsed json data into listview,now i want to put on him a search functionality,but i have a problem,when i entered a words in edittext,then in the listview my items are duplicated,and items has been increases,look my code and screen shots.Thanks in advance and any help will be much appreciated.

我的歌手活动:

    public class Artists extends Activity {

// Connection detector
        ConnectionDetector cd;

        // Alert dialog manager
        AlertDialogManager alert = new AlertDialogManager();

        // Progress Dialog
        private ProgressDialog pDialog;

        // Creating JSON Parser object
        JSONParser jsonParser = new JSONParser();
        // This is not using now if you want you can remove its all references :)
        ArrayList<HashMap<String, String>> albumsList;

        ArrayList<AdapterDTOArtist> mAdapterDTOs = null;
        private LazyAdapterArtist mLazyAdatper = null;

        private ArrayList<String> array_sort = new ArrayList<String>();
        int textlength = 0;

        // albums JSONArray
        JSONArray albums = null;

LinearLayout ll_artists_chart;
LinearLayout ll_artists_newrelease;
private EditText etSearch;

   private static String URL_ALBUMS = "http://triplevmusic.com/dev/webservice/index.php?op=fetch_artists.json";

// JSON Node names
private static final String TAG_CONTACTS = "data";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";

private ListView lv = null;
EditText et_artists_searchWord;
// contacts JSONArray
JSONArray contacts = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.artists);

    lv = (ListView) findViewById(R.id.artist_main_list_id);

    cd = new ConnectionDetector(getApplicationContext());

    // Check for internet connection
    if (!cd.isConnectingToInternet()) {
        // Internet Connection is not present
        alert.showAlertDialog(Artists.this,
                "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    }

    // Hashmap for ListView
            albumsList = new ArrayList<HashMap<String, String>>();
            mAdapterDTOs = new ArrayList<AdapterDTOArtist>();

            // Loading Albums JSON in Background Thread
            new LoadAlbums().execute();

            // get listview

            /**
             * Listview item click listener TrackListActivity will be lauched by
             * passing album id
             * */
            lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                        long arg3) {
                    // on selecting a single album

                }
            });


    ll_artists_chart = (LinearLayout) findViewById(R.id.ll_artists_chart);
    ll_artists_newrelease = (LinearLayout) findViewById(R.id.ll_artists_newrelease);
    et_artists_searchWord = (EditText) findViewById(R.id.et_artists_searchWord);

    et_artists_searchWord.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        //  ((Filterable) Artists.this.mAdapterDTOs).getFilter().filter(s);
            List<AdapterDTOArtist> list = filter(s.toString(),mAdapterDTOs, true);
            mAdapterDTOs.addAll(list);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
    });

    ll_artists_chart.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getBaseContext(), ChartActivity.class);
            startActivity(intent);
        //  finish();
        }
    });

    ll_artists_newrelease.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getBaseContext(), NewReleases.class);
            startActivity(intent);
            //finish();
        }
    });



}

/**
 * Background Async Task to Load all Albums by making http request
 * */
class LoadAlbums extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(Artists.this);
        pDialog.setMessage("Listing Artists ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Albums JSON
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        //List<NameValuePair> params = new ArrayList<NameValuePair>();
        ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

        // Creating JSON Parser instance
        JSONParser jParser = new JSONParser();

        JSONObject json = jParser.getJSONFromUrl(URL_ALBUMS);

        // getting JSON string from URL
        //String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET", params);

        // Check your log cat for JSON reponse
        Log.i("Albums JSON: ", "> " + json);

        try {
            //albums = new JSONArray(json);
            albums = json.getJSONArray(TAG_CONTACTS);

            if (albums != null) {
                // looping through All albums
                for (int i = 0; i < albums.length(); i++) {
                    JSONObject c = albums.getJSONObject(i);

                    // Storing each json item values in variable
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);

                    /*String EateryThmbnailUrl = c
                            .getString(TAG_THMBNAIL_URL);*/
                    // ~\/Uploads\/EateryImages\/\/7\/41283f1f-8e6f-42d4-b3c1-01f990efb428.gif
                    /*EateryThmbnailUrl = HOST_URL
                            + EateryThmbnailUrl.replace("~", "");*/

                    AdapterDTOArtist adapterDTO = new AdapterDTOArtist();

                    adapterDTO.setmTag_Id(id);
                    adapterDTO.setmTag_Name(name);


                //  adapterDTO.setmImage_URL(EateryThmbnailUrl);

                    mAdapterDTOs.add(adapterDTO);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();
                    HashMap<String, Integer> map1 = new HashMap<String, Integer>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);


                    // adding HashList to ArrayList
                    albumsList.add(map);
                }
            } else {
                Log.d("Albums: ", "null");
            }

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

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all albums
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                // updating listview
                mLazyAdatper = new LazyAdapterArtist(Artists.this,
                        mAdapterDTOs);
                lv.setAdapter(mLazyAdatper);

                // mLazyAdatper.setDataSet(mAdapterDTOs);

            }
        });

    }

}

public static List<AdapterDTOArtist> filter(String string,
        Iterable<AdapterDTOArtist> iterable, boolean byName) {
    if (iterable == null)
        return new LinkedList<AdapterDTOArtist>();
    else {
        List<AdapterDTOArtist> collected = new LinkedList<AdapterDTOArtist>();
        Iterator<AdapterDTOArtist> iterator = iterable.iterator();
        if (iterator == null)
            return collected;
        while (iterator.hasNext()) {
            AdapterDTOArtist item = iterator.next();
            collected.add(item);
        }
        return collected;
    }
}

}

我AdapterDTOArtist类:

My AdapterDTOArtist class :

   public class AdapterDTOArtist {

private String mTag_Id;
private String mTag_Name;

public String getmTag_Name() {
    return mTag_Name;
}

public void setmTag_Name(String mTag_Name) {
    this.mTag_Name = mTag_Name;
}

public String getmTag_Id() {
    return mTag_Id;
}

public void setmTag_Id(String mTag_Id) {
    this.mTag_Id = mTag_Id;
}

}

我LazyAdapterArtist类:

My LazyAdapterArtist class:

   public class LazyAdapterArtist extends BaseAdapter {

private Context mContext = null;
private ArrayList<AdapterDTOArtist> mAdapterDTOs = null;

public LazyAdapterArtist(Context context,
        ArrayList<AdapterDTOArtist> mAdapterDTOs2) {
    // TODO Auto-generated constructor stub
    this.mContext = context;
    this.mAdapterDTOs = mAdapterDTOs2;
}

public void setDataSet(ArrayList<AdapterDTOArtist> adapterDTOs) {
    this.mAdapterDTOs = adapterDTOs;
    notifyDataSetChanged();
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return mAdapterDTOs.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View row = convertView;
    ViewHolder mHolder = new ViewHolder();

    if (row == null) {
        // Cell is inflating for first time
        row = LayoutInflater.from(mContext)
                .inflate(com.whizpool.triplevmusic.R.layout.row_artists,
                        null, false);

        mHolder.mNameTxt = (TextView) row
                .findViewById(com.whizpool.triplevmusic.R.id.tv_row_artists);

        row.setTag(mHolder);

    } else {
        // recycling of cells
        mHolder = (ViewHolder) row.getTag();
    }

    mHolder.mNameTxt.setText(mAdapterDTOs.get(position).getmTag_Name());

    return row;
}

static class ViewHolder {

    TextView mNameTxt = null;

}
}

解析JSON数据到ListView控件时,我的应用程序是这样的:

when parsed json data into listview my app look like this:

在的EditText字段中输入字的时候,然后我的应用程序是这样的:

when enter word in edittext field then my app look like this:

我只是想,当我进入这个词,例如我输入D,然后在ListView只有那些话是显示已开始的词是D.Thanks了很多,又对不起我的英语水平。

I just want,when i entered the word for example i enter "D" then in a listview only those words were display which have starting word is "D".Thanks Alot and again sorry for my english.

推荐答案

的问题是,当您筛选再次添加到 mAdapterDTOs 数据列出你所需要的结果加入结果之前清空列表。为避免丢失你的数据,你必须让他们在一个单独的列表,并在用户时间没有告诉他们。

The problem is that when you filter the data you add again to mAdapterDTOs list the results you need to clear the list before adding the results. To avoid losing your data you have to keep them in a separate list and when user times nothing show them.

步骤1:用一个字段让您的数据备份(就像 mAdapterDTOs

Step 1: Use a field for keeping a backup of your data (just as mAdapterDTOs):

    ArrayList<AdapterDTOArtist> mAdapterDTOs = null;
    ArrayList<AdapterDTOArtist> mAdapterDTOsBackup= null;

第2步:初始化该域:

Step 2: initialize that field:

        mAdapterDTOs = new ArrayList<AdapterDTOArtist>();
        mAdapterDTOsBackup = new ArrayList<AdapterDTOArtist>();

步骤3:在所有的数据到备份只是解析之后设置填充:

Step 3: Fill in all your data to the backup set just after parsing:

 /**
 * getting Albums JSON
 * */
protected String doInBackground(String... args) {

        // HERE all your code as it is!!!

    // Just before return add a set keeping the backup of your data...
    // initialize the set just as mAdapterDTOs
    mAdapterDTOsBackup.addAll(mAdapterDTOs);
    return null;
}

第四步:当从备份集搜索过滤数据,然后将它们添加在 mAdapterDTOs 不要忘记之前将其清除。

Step 4: When searching filter data from backup set and then add them on the mAdapterDTOs do not forget to clear it before.

et_artists_searchWord.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub
    //  ((Filterable) Artists.this.mAdapterDTOs).getFilter().filter(s);
        List<AdapterDTOArtist> list = filter(s.toString(),mAdapterDTOsBackup, true);
        mAdapterDTOs.clear(); // <--- clear the list before add
        mAdapterDTOs.addAll(list); // <--- here is the double add if you do not clear before
        mLazyAdatper.setDataSet(mAdapterDTOs);// update the adapter data (edit 2)
    }

编辑:拆分答案的步骤,以更清晰的过程中也增加了你的行中的至少一个,以显示在哪里添加的每个code段

split answer in steps in order to be more clear the process also added at least one of your line to show where to add each code snippet.

这篇关于Android的解析JSON数据,并添加搜索功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆