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

问题描述:

自从我陷入这个问题以来已经过去了一个星期。 我开发了一个应用程序,使用listVieweditText来进行搜索。当我进行搜索时,新列表显示得非常好,但是当我点击该项目时,它将我重定向到内部列表的项目。 我不知道该怎么做,请帮助我。这些是我的代码。 - 对于ReaderListAdapterListView在过滤后没有显示正确的项目

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); 
       }}});}} 

请帮助我。提前致谢!

我认为onItemClick中的代码是造成这种情况的原因。

问题: searchTerm =“yahoo” 您过滤了yahoo并显示了雅虎的listitem。让我们说它在列表中的位置是0.当用户点击它时,onItemClick将被调用,并且情况0:将被执行。 正确的逻辑应该是,

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 
+0

嘿,这不能与“名” logique,代码做,如果我们有2个itemes具有为例“googleAd”和“googletest”这将COS一probleme。正确的做法是与职位合作。但它不适合我:( –

+0

这就是为什么我评论一个id为listitem。你不能使用职位的原因,我解释以上。 – brainfreak

+0

什么ou建议解决这个问题? –