2016-09-01 1 views
1

Folgende ist meine Adapterklassegesucht Listenansicht ändert Punkt Position, wenn ich auf gesuchten Artikel klicken

public class SongAdapter extends BaseAdapter{ 

    Context context; 
    //private ArrayList<SongModel> songsList = null; 
    SongAdapter songAdapter; 
    private ArrayList<SongModel> songsListDat = null; 
    private ArrayList<SongModel> songsList; 
    private static LayoutInflater inflater; 

    public SongAdapter(FragmentActivity activity, ArrayList<SongModel> songsListDat) { 

     this.context = activity; 
     this.songsListDat = songsListDat; 
     this.songsList = new ArrayList<SongModel>(); 
     this.songsList.addAll(songsListDat); 

    } 

    @Override 
    public int getViewTypeCount() { 

     return getCount(); 
    } 

    @Override 
    public int getCount() { 
     return songsListDat.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return songsListDat.get(position); 
    } 

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

    @Override 
    public int getItemViewType(int position) { 

     return position; 
    } 

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

     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View vi = convertView; 
     if (convertView == null) 
      vi = inflater.inflate(R.layout.playlist_item, null); 

     TextView title = (TextView) vi.findViewById(R.id.songTitle); // title 
     SongModel song = new SongModel(); 
     song = songsListDat.get(position); 
     // Setting all values in listview 
     title.setText(song.getSongTitle()); 

     return vi; 
    } 


    // Filter Class 
    public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 
     songsListDat.clear(); 
     if (charText.length() == 0) { 
      songsListDat.addAll(songsList); 
     } 
     else { 
      for (SongModel song : songsList) { 
       if (song.getSongPath().toLowerCase(Locale.getDefault()).contains(charText)) { 
        songsListDat.add(song); 
       } 
      } 
     } 
     notifyDataSetChanged(); 
} 

Nach meiner Haupttätigkeit Klasse Fragmente

EditText edtSearch; 
ListAdapter adapter; 
SongAdapter songAdapter; 
ArrayList<SongModel> songList = new ArrayList<SongModel>(); 
SongsManager songsManager = new SongsManager(); 

// Songs list 
public ArrayList<SongModel> songsList = new ArrayList<>(); 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
    View windows = inflater.inflate(R.layout.playlist, container, false); 
    return windows; 
} 

@Override 
public void onViewCreated(View v, Bundle savedInstanceState) { 
    super.onViewCreated(v, savedInstanceState); 

    edtSearch = (EditText)getView().findViewById(R.id.search); 
    final ArrayList<SongModel> songsListData = songsManager.songList; 
    Log.i("songsListData...",""+songsListData.size()); 
    SongsManager plm = new SongsManager(); 

    // get all songs from sdcard 
    this.songsList = plm.getPlayList(); 

    // looping through playlist 
    for (int i = 0; i < songsListData.size(); i++) { 
     // creating new HashMap 
     SongModel song = songsListData.get(i); 

     // adding HashList to ArrayList 
     songsListData.add(song); 
    } 
    // Adding menuItems to ListView 
    /* adapter = new SimpleAdapter(getActivity(), songsListData, R.layout.playlist_item, new String[] { "songTitle" }, new int[] { 
      R.id.songTitle });*/ 

    songAdapter = new SongAdapter(getActivity(),songsList); 
    setListAdapter(songAdapter); 
    // selecting single ListView item 
    final ListView lv = getListView(); 

    // listening to single listitem click 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View arg0, 
           int position, long id) { 

      // getting listitem index 
      Log.i("Index", "..." + position); 
      //int songIndex = position; 
      // Starting new intent 
      Intent i = new Intent(getActivity().getApplicationContext(),Main.class); 
      songAdapter.getItem(position); 
      // Sending songIndex to PlayerActivity 
      i.putExtra("songIndex",position); 
      getActivity().setResult(100, i); 
      startActivityForResult(i, 100); 
     } 
    }); 
    edtSearch.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence cs, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      String text = edtSearch.getText().toString().toLowerCase(Locale.getDefault()); 
      songAdapter.filter(text); 
     } 
    }); 
}} 

Das ist meine Modellklasse ist

Öffentlichkeit Klasse SongModel {

private String songPath; 
private String songTitle; 
public SongModel(String songPath,String songTitle) 
{ 
    this.songPath = songPath; 
    this.songTitle = songTitle; 
} 
public void setSongPath(String songPath){ 
    this.songPath = songPath; 
} 
public String getSongPath() { 
    return songPath; 
} 
public void setSongTitle(String songTitle){ 
    this.songTitle = songTitle; 
} 
public String getSongTitle() { 
    return songTitle; 
}} 

Wie bekomme ich die genaue Position der gesuchten Listenansicht Artikelposition. Wenn jemand weiß, hilf mir. Vielen Dank im Voraus ....

+0

nach Ihrer Frage, das Problem ist, wenn Original-ID des Songs ist 5 und nach der Suche wird es 1 und auf klicken Sie erhalten 1, aber Sie wollen 5, bin ich richtig? –

+0

Ja, ich stehe vor diesem Problem, wenn ich auf den gesuchten Gegenstand klicke und die falsche Position erhalte. –

+0

können Sie die SongModel-Klasse teilen? –

Antwort

1
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View arg0, 
          int position, long id) { 

     // getting listitem index 
     Log.i("Index", "..." + position); 
     //int songIndex = position; 
     // Starting new intent 
     Intent i = new Intent(getActivity().getApplicationContext(),Main.class); 
     SongModel song = (SongModel)songAdapter.getItem(position); 
     // Sending songIndex to PlayerActivity 
     i.putExtra("songIndex",song.getId()); 
     getActivity().setResult(100, i); 
     startActivityForResult(i, 100); 
    } 
});  

sehen Sie eine eindeutige ID für Lied in Ihrem Song Modell haben muss, dass id stattdessen übergeben. hoffe es hilft.

+0

Danke, es funktioniert –

0

versuchen diesen Code unter Änderung gegeben es entsprechend

public class SongAdapter extends ArrayAdapter<ToursModel> { 

    private List<SongModel> originalList; 
    private List<SongModel> tourList; 
    private SongFilter filter; 
    private Context context; 

    public SongAdapter(Context context, int resource, List<SongModel> songList) { 
     super(context, resource, songList); 
     this.context = context; 
     this.songList = new ArrayList<SongModel>(); 
     this.songList.addAll(tourList); 
     this.originalList = new ArrayList<>(); 
     this.originalList.addAll(songList); 
//  backup = songList; 
     getFilter(); 
    } 

    @Override 
    public Filter getFilter() { 
     if (filter == null) { 
      filter = new TourFilter(); 
     } 
     return filter; 
    } 

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

     ViewHolder holder = null; 
     // Log.v("ConvertView", String.valueOf(position)); 
     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) context.getSystemService(
        Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.tour_list_item, null); 

      holder = new ViewHolder(); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     return convertView; 
    } 


    private class ViewHolder { 
     TextView songName; 
    } 

    private class TourFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      constraint = constraint.toString().toLowerCase(); 
      FilterResults result = new FilterResults(); 
      if (constraint != null && constraint.toString().length() > 0) { 
       ArrayList<SongModel> filteredItems = new ArrayList<SongModel>(); 

       for (int i = 0, l = originalList.size(); i < l; i++) { 
        SongModel country = originalList.get(i); 
        if (country.getTourDes().toString().toLowerCase().contains(constraint)) 
         filteredItems.add(country); 
       } 
       result.count = filteredItems.size(); 
       result.values = filteredItems; 
      } else { 
       synchronized (this) { 
        result.values = originalList; 
        result.count = originalList.size(); 
        // Log.e("originalist", "" + originalList.size()); 
       } 
//    // Log.e("originalist", "original"); 
      } 
      return result; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      tourList = (ArrayList<SongModel>) results.values; 

      notifyDataSetChanged(); 
      clear(); 
      for (int i = 0, l = songList.size(); i < l; i++) 
       add(tourList.get(i)); 
//    notifyDataSetInvalidated(); 

     } 
    } 
} 
1

Die ursprünglichen Indizes der Elemente verloren, wenn filter() und notifyDatasetChanged() genannt werden. Um die ursprünglichen Positionen, tun dies in onItemClick() abzurufen:

SongModel sm = songAdapter.getItem(position); 
int originalIndex = songAdapter.songList.indexOf(sm); 
//Do whatever you want with originalIndex 
+0

auch dank dir ... deine Logik funktioniert auch. –

1

Ich habe einfache Antwort für Sie. In Ihrem onItemClick() wo Sie songAdapter.getItem(position); ausführen, tun Sie etwas wie folgt:

int actualPostion=songsList.indexOf(songAdapter.getItem(position)); 

Dies wird die aktuelle Position in der ursprünglichen Liste der ausgewählten Song sein.

Hoffe das hilft dir.

+0

Es funktioniert .... Vielen vielen Dank an Sie ... Ich habe dieses Problem letzten Tag. –

Verwandte Themen