2013-02-27 1 views
3

Я новичок в android и хочу разобрать данные json в listview, а затем добавить функциональность поиска, но я не знаю, как добавить поиск.как установить json проанализированные данные в listview, а затем добавить в него функции поиска

Java-класс:

public class AndroidJSONParsingActivity extends ListActivity { 


// url to make request 
private static String url = "http://10.0.2.2/quick/punk.php"; 

// JSON Node names 
private static final String TAG_CUSTOMER = "Customer"; 
private static final String TAG_CUSTOMER_CODE = "customer_code"; 
private static final String TAG_CUSTOMER_NAME = "customer_name"; 
private static final String TAG_CUSTOMER_MOBILE = "customer_mobile"; 
private static final String TAG_CUSTOMER_ADDRESS = "customer_address"; 

// contacts JSONArray 
JSONArray Customer = null; 

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


    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); 

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

    // getting JSON string from URL 
    JSONObject json = jParser.getJSONFromUrl(url); 

    try { 
     // Getting Array of Contacts 
     Customer = json.getJSONArray(TAG_CUSTOMER); 

     // looping through All Contacts 
     for(int i = 0; i < Customer.length(); i++){ 
      JSONObject c = Customer.getJSONObject(i); 

      // Storing each json item in variable 
      String customer_code = c.getString(TAG_CUSTOMER_CODE); 
      String customer_name = c.getString(TAG_CUSTOMER_NAME); 
      String customer_mobile = c.getString(TAG_CUSTOMER_MOBILE); 
      String customer_address = c.getString(TAG_CUSTOMER_ADDRESS); 




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

      // adding each child node to HashMap key => value 
      map.put(TAG_CUSTOMER_CODE, customer_code); 
      map.put(TAG_CUSTOMER_NAME, customer_name); 
      map.put(TAG_CUSTOMER_MOBILE, customer_mobile); 
      map.put(TAG_CUSTOMER_ADDRESS, customer_address); 


      // adding HashList to ArrayList 
      contactList.add(map); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    /** 
    * Updating parsed JSON data into ListView 
    * */ 
    ListAdapter adapter = new SimpleAdapter(this, contactList, 
      R.layout.list_item, 
      new String[] { TAG_CUSTOMER_CODE, TAG_CUSTOMER_NAME,TAG_CUSTOMER_MOBILE,TAG_CUSTOMER_ADDRESS}, new int[] { 
        R.id.code, R.id.name,R.id.mobile,R.id.address}); 

    setListAdapter(adapter); 

} 

} 

Файл XML является:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 
<EditText 
    android:id="@+id/search" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 
<!-- Main ListView 
    Always give id value as list(@android:id/list) 
--> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="50dip" 
    android:layout_height="wrap_content" 
    android:text="+" /> 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 

То, что я хочу, что, когда пользователь вводит что-то в текстовое поле, он должен искать в данных, которые есть в списке. Может ли кто-нибудь сказать мне, как его реализовать?

ответ

1

Используйте адаптер пользовательского списка для отображения элементов в списке. Отобразите editText сверху. Для пользовательского Listview http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/.

Для поиска listview. How can I filter ListView data when typing on EditText in android.

Для пользовательского поиска implement search on a custom listview. Я предлагаю вам пойти с поиском по пользовательскому списку с фильтрами.

Редактировать

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 
<EditText 
android:id="@+id/search" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"/> 
<ListView 
android:id="@+id/list" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"/> 
</LinearLayout> 

MainActivity Класс

public class MainActivity extends Activity { 
ArrayList<NewData> mTemp=new ArrayList<NewData>(); 
ArrayList<NewData> mPostingData=new ArrayList<NewData>(); 
ArrayList< NewData> mOri = new ArrayList<NewData>(); 

    Myadapter ma; 
    EditText search; 

    NewData nd; 

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


      for(int i = 0; i < 20; i++) 
      { 
       // Add your Json Parsed Data here 
       // each item from json add it to hash map in NewData class. Arraylist of 0 contains jsondata of customer1 
       nd=new NewData(); 

       nd.newDatacus.put(NewData.TAG_CUSTOMER_CODE, "i"+i); 
       nd.newDatacus.put(NewData.TAG_CUSTOMER_NAME, "a"+i); 
       nd.newDatacus.put(NewData.TAG_CUSTOMER_MOBILE, "number"); 
       nd.newDatacus.put(NewData.TAG_CUSTOMER_ADDRESS, "address"); 
       mOri.add(nd); 
      } 

     ma= new Myadapter(MainActivity.this); 
     mPostingData=mOri; 
     mTemp=mOri; 
     ListView lv= (ListView) findViewById(R.id.list); 
     lv.setAdapter(ma); 
     search= (EditText) findViewById(R.id.search); 
     search.addTextChangedListener(new TextWatcher() { 

      public void onTextChanged(CharSequence s, int start, int before, int count) { 
          ma.getFilter().filter(s); 
          ma.notifyDataSetChanged(); 

      } 

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


       } 

       public void afterTextChanged(Editable s) { 
       } 
       }); 


    } 



class Myadapter extends ArrayAdapter 
{ 
    LayoutInflater mInflater; 


    public void setData(ArrayList<NewData> mPpst) { 
      mPostingData = mPpst;//contains class items data. 
     } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       if (results != null && results.count >= 0) { 
        setData((ArrayList<NewData>) results.values);//if results of search is null set the searched results data 
       } else { 
        setData(mOri);// set original values 
       } 

       notifyDataSetInvalidated(); 
      } 



      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults result = new FilterResults(); 
       if (!TextUtils.isEmpty(constraint)) { 
        constraint = constraint.toString().toLowerCase(); 
        ArrayList<NewData> foundItems = new ArrayList<NewData>(); 
        if(mTemp!=null) 
        { 
        for(int i=0;i<mTemp.size();i++) 
        { 

         if (mTemp.get(i).newDatacus.get(NewData.TAG_CUSTOMER_CODE).toString().contains(constraint)) { 
          System.out.println("My datas"+mTemp.get(i).newDatacus.get(NewData.TAG_CUSTOMER_CODE).toString()); 
          foundItems.add(mTemp.get(i)); 

         } 
         else 
         { 

         } 
        } 
        } 
        result.count = foundItems.size();//search results found return count 
        result.values = foundItems;// return values 
       } 
       else 
       { 
        result.count=-1;// no search results found 
       } 


       return result; 
      } 
     }; 
    } 
    public Myadapter(Context context) { 
     super(context, 0); 
     mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     // TODO Auto-generated constructor stub 
    } 

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

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

    @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 
     ViewHolder holder; 


      if(mOri == null){ 

       return null; 
      } 
        // When convertView is not null, we can reuse it directly, there is no need 
        // to reinflate it. We only inflate a new View when the convertView supplied 
        // by ListView is null. 
        if (convertView == null) { 
         convertView = mInflater.inflate(R.layout.list, null); 
         convertView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.FILL_PARENT, 
           LayoutParams.WRAP_CONTENT)); 
         // Creates a ViewHolder and store references to the two children views 
         // we want to bind data to. 
         holder = new ViewHolder(); 
         holder.t1=(TextView) convertView.findViewById(R.id.textView1); 
         holder.t2 = (TextView) convertView.findViewById(R.id.textView2); 
         holder.t3 = (TextView) convertView.findViewById(R.id.textView3); 

         convertView.setTag(holder); 
        } else { 
         // Get the ViewHolder back to get fast access to the TextView 
         // and the ImageView. 
         holder = (ViewHolder) convertView.getTag(); 
        } 
        holder.t1.setText(mPostingData.get(position).newDatacus.get(NewData.TAG_CUSTOMER_CODE).toString()); 
        holder.t2.setText(mPostingData.get(position).newDatacus.get(NewData.TAG_CUSTOMER_NAME).toString()); 
        holder.t3.setText(mPostingData.get(position).newDatacus.get(NewData.TAG_CUSTOMER_MOBILE).toString()); 
        return convertView; 
     } 
} 
class ViewHolder 
{ 
TextView t1,t2,t3; 
} 
} 

list.xml накачиваются в пользовательский список адаптера

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:text="TextView" /> 

    <TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:text="TextView" /> 

    <TextView 
    android:id="@+id/textView3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dp" 
    android:text="TextView" /> 

    </LinearLayout> 

NewData class- Вмещает все данные в hashmap

public class NewData { 
public static final String TAG_CUSTOMER_CODE = "customer_code"; 
public static final String TAG_CUSTOMER_NAME = "customer_name"; 
public static final String TAG_CUSTOMER_MOBILE = "customer_mobile"; 
public static final String TAG_CUSTOMER_ADDRESS = "customer_address"; 

    Hashtable newDatacus=new Hashtable(); 

    public NewData() 
    { 

     newDatacus.put(NewData.TAG_CUSTOMER_CODE,new String()); 
     newDatacus.put(NewData.TAG_CUSTOMER_ADDRESS,new String()); 
     newDatacus.put(NewData.TAG_CUSTOMER_NAME,new String()); 
     newDatacus.put(NewData.TAG_CUSTOMER_MOBILE,new String()); 
     newDatacus.put(NewData.TAG_CUSTOMER_ADDRESS,new String()); 




    } 
} 

Изменить так, чтобы вы добавляли данные json в цикл for. Я сделал критерии поиска здесь идентификатор клиента. Вы можете изменить это в соответствии с вашими потребностями. Этот код проверен и работает. Надеюсь, кто-то может дать лучший код. Надеюсь, это поможет вам.

+0

Посмотрите, когда мы обрабатываем json-данные в listview, тогда мы даем id из вида списка as (android: id = "@ android: id/list") .. но для поиска из списка мне нужен id списка, например (lv = (listview) findviewbyid (R.id. (*))) вместо звездочки мне нужен listview id .. – Dev

+0

для поиска в listview вам просто нужно сравнить/фильтровать данные списка в соответствии с тем, что введено в редактировать текст. Отображать новые данные в соответствии с списком на основе ввода пользователем в edittext. – Raghunandan

+0

, если ваш список отображает список имен, затем введите данные как и когда пользовательские типы в editext сравнивают его со списком данных и сообщают об этом адаптеру изменений и отображаемых элементов. – Raghunandan