2017-12-15 20 views
1

ArrayAdapter을 확장하는 ListViewAdapter을 사용하여 결과를 ListView에 표시하고 있습니다. 출력을 표시하려면 ListView에 3 TextView이 있어야합니다. searchview를 구현하고 싶지만 검색 창에 입력하면 화면이 공백이됩니다. 어떻게 구현합니까? 나는 addTextChangedListenerEditText를 사용하여 시도하지만 output.This 당신은 당신의 결과를 얻을 수있는 필터링 할 수있는 인터페이스를 구현할 필요가 여기 Activitymulticolum listview에 대한 searchview

searchView = (SearchView)findViewById(R.id.searchView); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      adapter.getFilter().filter(newText); 
      return false; 
     } 
    }); 

} 

private void loadDescriptionList() { 
    final ProgressDialog progressDialog = new ProgressDialog(TestDetails.this); 
    progressDialog.setMessage("Loading Data..."); 
    progressDialog.show(); 
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) 
       { 
        progressDialog.dismiss(); 

        try { 
         JSONObject obj = new JSONObject(response); 
         JSONArray heroArray = obj.getJSONArray("list"); 

         for (int i = 0; i < heroArray.length(); i++) { 
          JSONObject heroObject = heroArray.getJSONObject(i); 
          TDescription hero = new TDescription(heroObject.getString("test_code"), heroObject.getString("test_description"),heroObject.getString("test_price")); 
          heroList.add(hero); 
         } 
         adapter = new ListViewAdapter(heroList, getApplicationContext()); 
         listView.setAdapter(adapter); 
        } catch (JSONException e) { 
         progressDialog.dismiss(); 
         e.printStackTrace(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        progressDialog.dismiss(); 
        Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    requestQueue.add(stringRequest); 
} 

LISTVIEWADAPTER.JAVA

public class ListViewAdapter extends ArrayAdapter<TDescription> { 
private List<TDescription> heroList; 
private Context mCtx; 
Typeface typeface; 
TextView rup; 
public ListViewAdapter(List<TDescription> heroList, Context mCtx) { 
    super(mCtx, R.layout.list_items, heroList); 
    this.heroList = heroList; 
    this.mCtx = mCtx; 
    typeface = Typeface.createFromAsset(mCtx.getAssets(), "fontawesome-webfont.ttf"); 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(mCtx); 
    View listViewItem = inflater.inflate(R.layout.list_items, null, true); 

    TextView code = (TextView)listViewItem.findViewById(R.id.code); 
    TextView desc = (TextView)listViewItem.findViewById(R.id.desc); 
    TextView price = (TextView)listViewItem.findViewById(R.id.price); 
    rup = (TextView)listViewItem.findViewById(R.id.rupee); 
    rup.setTypeface(typeface); 
    TDescription hero = heroList.get(position); 
    code.setText(hero.getCode()); 
    desc.setText(hero.getDesc()); 
    price.setText(hero.getPrice()); 
    return listViewItem; 
} 

} enter image [description]1

+0

이동에 따라 데이터를 필터링하고 자신의 논리 –

+0

을 구현하는 것이 [링크] (HTTPS에 보라. co.kr/questions/24769257/custom-listview-adapter-with-filter-android) –

답변

1

없다 목록보기 어댑터 클래스를 아래 코드로 변경하십시오.

// 유래 :
public class ListViewAdapter extends ArrayAdapter<TDescription> implements Filterable { 
private List<TDescription> heroList; 
private List<TDescription> mFilterData; 
private Context mCtx; 
private ItemFilter mFilter = new ItemFilter(); 
private TextView rup; 

public ListViewAdapter(List<TDescription> heroList, Context mCtx) { 
    super(mCtx, R.layout.list_items, heroList); 
    this.heroList = heroList; 
    this.mFilterData = heroList; 
    this.mCtx = mCtx; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(mCtx); 
    View listViewItem = inflater.inflate(R.layout.list_items, null, true); 

    TextView code = (TextView) listViewItem.findViewById(R.id.code); 
    TextView desc = (TextView) listViewItem.findViewById(R.id.desc); 
    TextView price = (TextView) listViewItem.findViewById(R.id.price); 
    rup = (TextView) listViewItem.findViewById(R.id.rupee); 
    TDescription hero = mFilterData.get(position); 
    code.setText(hero.getCode()); 
    desc.setText(hero.getDesc()); 
    price.setText(hero.getPrice()); 
    return listViewItem; 
} 


public int getCount() { 
    return mFilterData.size(); 
} 

public TDescription getItem(int position) { 
    return mFilterData.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

@NonNull 
public Filter getFilter() { 
    return mFilter; 
} 

private class ItemFilter extends Filter { 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     String userString = constraint.toString().toLowerCase(); 

     FilterResults filterResults = new FilterResults(); 

     final List<TDescription> originalList = heroList; 

     int count = originalList.size(); 
     final ArrayList<TDescription> resultList = new ArrayList<>(count); 

     TDescription tDescription; 

     for (int i = 0; i < count; i++) { 
      tDescription = originalList.get(i); 
      if (tDescription.getDesc().toLowerCase().contains(userString)) { 
       resultList.add(tDescription); 
      } 
     } 

     filterResults.values = resultList; 
     filterResults.count = resultList.size(); 

     return filterResults; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     mFilterData = (ArrayList<TDescription>) results.values; 
     notifyDataSetChanged(); 
    } 

} 

} 

는 영웅 클래스 재정의`필터() 어댑터`방법에 귀하의 설명

+0

감사합니다. 완벽하게 작동합니다. –

+0

그 때 대답을 수락하고 위로 투표하십시오 @AparnaMutnalkar –

+1

나는 시도했다 그러나 나가 15의 명망을 필요로 한 ㄴ다는 것을 밝힌다. –