过滤后ListView没有显示正确的项目

时间:2015-04-08 02:29:04

标签: android listview filter

自从我遇到这个问题以来已经过了一周。 我使用listVieweditText开发了一个应用程序来进行搜索。当我进行搜索时,新列表显示得非常好,但是当我点击该项目时,它会将我重定向到真实列表中的项目。 我不知道该怎么做请帮助我。这些是我的代码。 - 对于ReaderListAdapter

 public class ReaderListAdapter extends BaseAdapter {
ArrayList<Reader> listReader = new ArrayList<Reader>();
ArrayList<Reader> arrayList;
LayoutInflater layoutInflater;
Context context;
int lastPosition = -1;

// constructeur
public ReaderListAdapter(Context context, ArrayList<Reader> listReader) {
    this.listReader = listReader;
    this.context = context;
    arrayList = new ArrayList<Reader> ();;
    layoutInflater = LayoutInflater.from(this.context);
    arrayList.addAll(listReader);   
}   

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

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

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

static class ViewHolder {
    TextView nomView;
    TextView priceView;
    ImageView pictureView;
}

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

    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.reader_row, null);
        holder = new ViewHolder();
        // initialisation des vues
        holder.nomView = (TextView) convertView.findViewById(R.id.name);
        holder.priceView = (TextView) convertView.findViewById(R.id.price);
        holder.pictureView = (ImageView) convertView.findViewById(R.id.picture);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    // affchier les données convenablement dans leurs positions
    holder.nomView.setText(listReader.get(position).getName());
    holder.priceView.setText(String.valueOf(listReader.get(position).getPrice()));
    holder.pictureView.setBackgroundDrawable(listReader.get(position).getPicture());

    // changer R.anim.ton_effet
    Animation animation = AnimationUtils.loadAnimation(context,(position > lastPosition)
                          ? R.anim.up_from_bottom: R.anim.up_from_bottom);
    convertView.startAnimation(animation);
    position=lastPosition;
    return convertView;
}

// Filter Class
public void filter(String charText) {

    charText = charText.toLowerCase(Locale.getDefault());
    listReader.clear();
    if(charText.length()==0){
        listReader.addAll(arrayList);
    }
    else{
        for (Reader c : arrayList) {
            if (c.getName().toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                listReader.add(c);
            }
        }
    }
    notifyDataSetChanged();
}
}

- 对于MainActivity

 public class MainActivity extends Activity {

String[] listNames = { "kooora","yahoo", "hespress"};

int[] listPrices = { 1, 2, 3 };

ArrayList<Reader> listReader = new ArrayList<Reader>();;
ArrayList<Reader> listReaderNew;
ListView lv;
EditText search;
ReaderListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    lv = (ListView) findViewById(R.id.listReader);
    search = (EditText) findViewById(R.id.search);
    Drawable[] listPictures = {getResources().getDrawable(R.drawable.a1),getResources().getDrawable(R.drawable.a2),getResources().getDrawable(R.drawable.a3)};

    for (int i = 0; i < listPictures.length; i++) {
        listReader.add(new Reader(i + 1, listNames[i], listPictures[i], listPrices[i]));
    }

    adapter=new ReaderListAdapter(getApplicationContext(), listReader);
    lv.setAdapter(adapter); 

    //lv.setAdapter(new ReaderListAdapter(getApplicationContext(), listReader));
    search.addTextChangedListener(new TextWatcher() {
        @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub          
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
            String text = search.getText().toString().toLowerCase(Locale.getDefault());
            MainActivity.this.adapter.filter(text);

        }});    

        lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        {
            Intent intent=new Intent(MainActivity.this,WebActivity.class);

            switch (position) {
            case 0:                
                intent.setData(Uri.parse("http://www.kooora.com")) ;break;     
            case 1:
                intent.setData(Uri.parse("http://www.yahoo.com")) ;break;        
            case 2:
                intent.setData(Uri.parse("http://www.hespress.com")) ;break;              }if (intent != null) {
                  startActivity(intent);
                }}});}}

请帮帮我。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我认为onItemClick中的代码导致了这一点。

问题: searchTerm =&#34; yahoo&#34; 你过滤雅虎并显示雅虎的listitem。让我们说它在列表中的位置是0.当用户点击它时,将调用onItemClick并执行case 0:case。 正确的逻辑应该是,

Reader reader = parent.getAdapter().getItem(position);
String searchTerm = reader.getName(); // or whichever is the id for that listitem

if(searchTerm.contains("yahoo")) {
    intent.setData(Uri.parse("http://www.yahoo.com"))
} // and so on