क्या मेरे कस्टम सूची दृश्य पर खोज फ़िल्टर बनाने का कोई तरीका है जो ArrayAdapter की बजाय बेसएडाप्टर का उपयोग करके बनाया गया है, क्योंकि मैं केवल उन विधियों में आया हूं जो कस्टम सूची दृश्यों में ArrayAdapters का उपयोग कर रहे हैं। Follwing वह है जो मैं Making a filter using Array Adapterएंड्रॉइड: सूची दृश्य एक खोज फ़िल्टर करें
उत्तर
यदि आप सूची संग्रह का उपयोग कर रहे हैं तो ArrayAdapter का विस्तार करें - यह बेसएडाप्टर का उप-वर्ग है।
getView विधि को ओवरराइड करें (अपने मामले में बस अपने पुराने getView कोड को छोटे संशोधनों के साथ कॉपी करें)। वस्तु की
अवहेलना toString अपने संग्रह में है और सेट है कि:
listView.setTextFilterEnabled(true);
मैं अभी यह कर रहा हूं 'क्लास फ्रेंड्सलिस्ट एडाप्टर बेसएडाप्टर लागू करता है फ़िल्टर करने योग्य' कृपया मुझे बताएं कि बेसएडाप्टर को ओवरराइड करके आपका क्या मतलब है? – hassanadnan
जैसा कि मैंने लिखा है, यह ऐरेएडाप्टर को ओवरराइड करने के लिए बहुत आसान होगा: 'क्लास फ्रेंड्स लिस्ट एडाप्टर ऐरेएडाप्टर
बढ़ाता है या लेआउट में ListView के लिए textFilterEnabled =" true "लेता है – pawelzieba
ArrayAdapter BaseAdapter का एक बच्चा वर्ग है।
ArrayAdapter के लिए स्रोत कोड here है। इसे देखो ..
यह आपकी समस्या का समाधान करना चाहिए।
यहां एक उदाहरण है। आपको जो चाहिए उसे संपादित करें और उपयोग करें।
public class CustomListAdapter extends BaseAdapter {
private ArrayList<String> countryStringList;
private ArrayList<Integer> countryImageList;
private LayoutInflater mInFlater;
// private Bitmap mIcon1;
// private Bitmap mIcon2;
private int layoutID;
private Context context;
// private LayoutInflater mInflater;
public CustomListAdapter(Context context, int textViewResourceId,
ArrayList<String> stringObjects, ArrayList<Integer> imgObjects) {
super();
this.context = context;
countryStringList = stringObjects;
countryImageList = imgObjects;
layoutID = textViewResourceId;
mInFlater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
// return countryStringList.size();
return countryStringList.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 position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolder holder;
if (convertView == null) {
convertView = mInFlater.inflate(layoutID, null);
holder = new ViewHolder();
holder.textCountryName = (TextView) convertView
.findViewById(R.id.txtSelectedCountryName);
holder.icon = (ImageView) convertView
.findViewById(R.id.imgSelectedCountryImage);
holder.textCountryPosition = (TextView) convertView
.findViewById(R.id.txtSelectedCountryPosition);
// holder.checkBoxListView=(CheckBox)convertView.findViewById(R.id.CheckBoxListView);
holder.relativeLayoutList = (RelativeLayout) convertView
.findViewById(R.id.relativeLayoutListItem);
holder.checkBoxListView = (CheckBox) convertView
.findViewById(R.id.checkBoxSelectedCountry);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
// holder=(ViewHolder)convertView.findViewById(R.id.TextViewIcon1)
}
holder.checkBoxListView.setTag(position);
holder.textCountryName.setText(countryStringList.get(position));
holder.textCountryPosition.setText(position + 1 + "/"
+ countryStringList.size());
holder.icon.setImageResource((countryImageList.get(position)));
if (ListViewController.checkStatusList.get(position).equalsIgnoreCase("present")) {
holder.checkBoxListView.setVisibility(View.VISIBLE);
} else {
holder.checkBoxListView.setVisibility(View.GONE);
}
/*
* holder.checkBoxListView.setOnCheckedChangeListener(new
* OnCheckedChangeListener(){
*
* @Override public void onCheckedChanged(CompoundButton buttonView,
* boolean isChecked) { // TODO Auto-generated method stub
*
* ListActivityImplementation listActivityImplementation = new
* ListActivityImplementation(); //show("Checkbox");
* ListActivityImplementation.countryStringList.remove(position);
* ListActivityImplementation.countryImageList.remove(position);
* ListActivityImplementation.lv.invalidateViews();
*
* //ListActivityImplementation.show("Checkbox"); }
*
* }) ;
*/
holder.textCountryName.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
holder.textCountryPosition.setText(position + 1 + "/"
+ countryStringList.size() + "clicked");
}
});
holder.checkBoxListView
.setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
MathHelper.showToast(context, buttonView.getTag()
+ " clicked");
}
});
return convertView;
}
}
class ViewHolder {
TextView textCountryName;
ImageView icon;
TextView textCountryPosition;
RelativeLayout relativeLayoutList;
CheckBox checkBoxListView;
}
इसके लिए धन्यवाद, लेकिन मैं जानना चाहता हूं कि फ़िल्टरबेल इंटरफ़ेस का उपयोग कैसे करें बेस एडाप्टर, ताकि मैं अपनी सूची दृश्य को फ़िल्टर कर सकूं – hassanadnan
यहाँ आधार अनुकूलक का उपयोग कर बनाई सूची दृश्य के लिए एक उदाहरण है। मैंने बहुत कुछ खोजा लेकिन मुझे कोई संतोषजनक समाधान नहीं मिला। इसलिए मैंने इसे ऊपर रखना सोचा ताकि भविष्य में यह दूसरों की मदद कर सके।
यहाँ है history_list_view.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:gravity="left|center"
android:layout_width="wrap_content" android:paddingBottom="5px"
android:paddingTop="5px" android:paddingLeft="5px">
<TextView android:text="@+id/historytext" android:id="@+id/historytext"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="10px" android:textColor="#0099CC"/>
</LinearLayout>
यहाँ के कोड है history_schedule.xml
का कोड history_container.xml<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:layout_width="fill_parent" android:layout_height="wrap_content"
android:id="@+id/filter_text" />
<FrameLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:id="@+id/historyContainerLayout" />
</LinearLayout>
यहाँ के कोड है
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView android:id="@+id/scrollItemInfo"
android:layout_width="fill_parent" android:layout_height="1000dip">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ListView android:id="@+id/historylist" android:layout_height="1000dip"
android:layout_width="fill_parent"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
क्षमा करें, मैं कोड को सही प्रारूप में नहीं डाल पा रहा हूं। ऐसा लगता है कि कोई टैग नहीं बदला गया है क्योंकि अब कोई टैग नहीं है। लेकिन उपयोगकर्ता सुविधा के लिए टैब रखना भी एक अच्छा विचार है। शायद यह मेरी गलती है कि मैं सही प्रारूप में पोस्ट नहीं कर पा रहा हूं। और ऐसा लगता है कि हम xml फ़ाइल सामग्री पोस्ट नहीं कर सकते हैं .. इसलिए, सोचें कि लेआउट कैसे डिज़ाइन किया गया होगा।
गतिविधि कोड है: -
package com.testfilter;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.TextView;
public class TestFilterListView extends Activity {
FrameLayout historyContainer;
ViewStub viewStub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.history_container);
historyContainer = (FrameLayout) findViewById(R.id.historyContainerLayout);
EditText filterEditText = (EditText) findViewById(R.id.filter_text);
filterEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
historyContainer.removeAllViews();
final List<String> tempHistoryList = new ArrayList<String>();
tempHistoryList.addAll(historyList);
for(String data : historyList) {
if(data.indexOf((s.toString())) == -1) {
tempHistoryList.remove(data);
}
}
viewStub = new ViewStub(TestFilterListView.this, R.layout.history_schedule);
viewStub.setOnInflateListener(new ViewStub.OnInflateListener()
{
public void onInflate(ViewStub stub, View inflated)
{
setUIElements(inflated, tempHistoryList);
}
});
historyContainer.addView(viewStub);
viewStub.inflate();
}
@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
}
});
setViewStub();
}
/********************************************************************************************************/
private void setViewStub()
{
historyList.add("first");
historyList.add("second");
historyList.add("third");
historyList.add("fourth");
historyList.add("fifth");
historyList.add("sixth");
historyList.add("seventh");
viewStub = new ViewStub(TestFilterListView.this, R.layout.history_schedule);
viewStub.setOnInflateListener(new ViewStub.OnInflateListener()
{
public void onInflate(ViewStub stub, View inflated)
{
setUIElements(inflated, historyList);
}
});
historyContainer.addView(viewStub);
viewStub.inflate();
}
/********************************************************************************************************/
final List<String> historyList = new ArrayList<String>();
String displayName = "";
ListView historyListView;
private void setUIElements(View v, List<String> historyLists)
{
if (v != null)
{
historyScheduleData.clear();
//historyList.clear();
historyScheduleData.addAll(historyLists);
historyListView = (ListView) findViewById(R.id.historylist);
historyListView.setAdapter(new BeatListAdapter(this));
registerForContextMenu(historyListView);
}
}
/********************************************************************************************************/
private static class BeatListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public BeatListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return historyScheduleData.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.history_list_view, null);
holder = new ViewHolder();
holder.historyData = (TextView) convertView
.findViewById(R.id.historytext);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.historyData.setText(historyScheduleData.get(position));
return convertView;
}
static class ViewHolder {
TextView historyData;
}
}
private static final List<String> historyScheduleData = new ArrayList<String>();
}
यहां यूआरएल है जहां आप मेरा ब्लॉग [लिंक] देख सकते हैं http://androidsearchfilterlistview.blogspot.com/ –
मैं अपने BaseAdapter में फिल्टर इंटरफ़ेस को लागू Shoud? – hassanadnan
आप क्या कर रहे हैं, कर्सर या ऐरे या कुछ और? – pawelzieba
मैं बेसएडाप्टर – hassanadnan