2013-11-21 21 views
5

Gdy miałem problemy z naprawieniem pozycji mojej listy Wyświetl elementy zgodnie z zamierzonym intencją po odfiltrowaniu, a otrzymałem informacje, że mogę zastąpić problem za pomocą niestandardowego adaptera, zrobiłem to, ale nie wiedzieć, jak przypisać kliknięcia do poszczególnych pozycji, sprawdź poniższy kod:Ustaw opcję Dodaj do niestandardowego adaptera ListView

public class IndexPageActivity extends Activity { 
ListView listView; 
EditText editTextB; 

@Override 
protected void onCreate(Bundle savfedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.indexpage); 
    listView = (ListView) findViewById(R.id.pageList); 
    editTextB = (EditText) findViewById(R.id.searchB); 
    listView.setAdapter(new PagesAdapter(this)); 
    listView.setOnItemClickListener((OnItemClickListener) this); 

} 
} 
class SingleRow { 
String pagedata; 
SingleRow(String pagedata){ 
    this.pagedata=pagedata; 
} 
} 
class PagesAdapter extends BaseAdapter implements OnItemClickListener{ 
ArrayList<SingleRow> pagelist; 
Context context; 

PagesAdapter(Context c){ 
    context=c; 
    pagelist = new ArrayList<SingleRow>(); 
    Resources res = c.getResources(); 
    String [] pagedatas = res.getStringArray(R.array.pages_data); 
    for (int i=0;i<463;i++){ 
     pagelist.add(new SingleRow(pagedatas[i])); 
    } 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return pagelist.size(); 
} 

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

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

@Override 
public View getView(int i, View view, ViewGroup viewG) { 
    // TODO Auto-generated method stub 
    LayoutInflater inflater=(LayoutInflater)    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View row=inflater.inflate(R.layout.single_row,viewG,false); 
    TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow); 

    SingleRow temp=pagelist.get(i); 

    pagetitle.setText(temp.pagedata); 
    return row; 
} 
@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int i, long arg3) { 
    // TODO Auto-generated method stub 

} 
} 

Doceniam każdą udzieloną pomoc. Dziękuję Yhu!

EDYTOWANIE

Czy to zadziała?

if (index == 0) { 
    Intent i = new Intent(this, WebViewActivity.class); 
    i.putExtra("keyHTML", "file:///android_asset/page1.html"); 
    startActivity(i); 
} else if (index == 1) { 
    Intent i = new Intent(this, WebViewActivity.class); 
    i.putExtra("keyHTML", "file:///android_asset/page2.html"); 
    startActivity(i); 
+0

przypisać kliknij do każdej pozycji? czy możesz rozwinąć? – Raghunandan

+0

Tak, tak jak poprzednio użyłem simple_list_layout i nie mam parametrów getItem, getCount, więc było to całkiem proste, teraz w przypadku niestandardowego adaptera z tymi parametrami, jestem zdezorientowany, jaki krok do zrobienia. –

+0

Napisz toast za pomocą metody onItemClick. Masz już przypisany moduł do nasłuchiwania kliknięć, ale nie widzisz połączenia zwrotnego. A także ponownie wykorzystaj swoje poglądy w metodzie getView. – Devrim

Odpowiedz

8

Zmieniano ALL

Właśnie to, czego potrzebujesz, dodałem filtr do baseAdapter a następnie na zmianę tekstu w editText You filtruj listView, a następnie przejdź do potrzebnej czynności.

tutaj jest pełny kod, ale trzeba mieć na uwadze, że zmieniły się, co następuje:

  • Zmieniłem PageList do ArrayList zamiast
  • Jest to błąd w filtrowaniu, że kiedy wymazać co napisałem w EditText nie aktualizuje ListView, musisz dowiedzieć się, dlaczego.
  • Zmieniono zwróconą wartość funkcji getItem(int i) z obiektu na ciąg
  • W polu onItemClick należy wyszukać nazwę zamiast pozycji.

oto kod:

public class IndexPageActivity extends Activity implements OnItemClickListener{ 
ListView listView; 
EditText editTextB; 
PagesAdapter adapter1; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
      listView = (ListView) findViewById(R.id.pageList); 
      editTextB = (EditText) findViewById(R.id.searchB); 
      adapter1 = new PagesAdapter(this); 
      listView.setAdapter(adapter1); 
      adapter1.notifyDataSetChanged(); 
      listView.setOnItemClickListener(this); 

      editTextB.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence cs, int arg1, int arg2, 
         int arg3) { 
        // When user changed the Text 
        IndexPageActivity.this.adapter1.getFilter().filter(cs.toString()); 
        adapter1.notifyDataSetChanged(); 
       } 

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


@Override 
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) { 
    // TODO Auto-generated method stub 
    Intent i; 
    String name = adapter1.getItem(position); 
      Log.d("id", name); 
    if (name.equals("Item1")) 
    { 
     i = new Intent(this, anActivity.class); 
     startActivity(i); 
    } 
    else if (name.equals("Item2")) 
    { 
     i = new Intent(this, anActivity2.class); 
     startActivity(i); 
    } 
} 
} 


class SingleRow { 
String pagedata; 
SingleRow(String pagedata){ 
    this.pagedata=pagedata; 
} 
} 
class PagesAdapter extends BaseAdapter implements Filterable{ 
ArrayList<String> pagelist; 
List<String> arrayList; 
Context context; 
String [] pagedatas; 

PagesAdapter(Context c){ 
    context=c; 
    pagelist = new ArrayList<String>(); 
    Resources res = c.getResources(); 
    pagedatas = res.getStringArray(R.array.pages_data); 
    for (int i=0;i<463;i++){ 
     pagelist.add(pagedatas[i]); 
    } 
} 
@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return pagelist.size(); 
} 

@Override 
public String getItem(int i) { 
    // TODO Auto-generated method stub 
    return pagelist.get(i); 
} 

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


@Override 
public View getView(int i, View view, ViewGroup viewG) { 
    // TODO Auto-generated method stub 
    LayoutInflater inflater=(LayoutInflater)    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View row=inflater.inflate(R.layout.single_row,viewG,false); 
    TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow); 

    String temp=pagelist.get(i); 

    pagetitle.setText(temp); 
    return row; 
} 

public class filter_here extends Filter{ 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     // TODO Auto-generated method stub 

     FilterResults Result = new FilterResults(); 
     // if constraint is empty return the original names 
     if(constraint.length() == 0){ 
      Result.values = pagelist; 
      Result.count = pagelist.size(); 
      return Result; 
     } 

     ArrayList<String> Filtered_Names = new ArrayList<String>(); 
     String filterString = constraint.toString().toLowerCase(); 
     String filterableString; 

     for(int i = 0; i<pagelist.size(); i++){ 
      filterableString = pagelist.get(i); 
      if(filterableString.toLowerCase().contains(filterString)){ 
       Filtered_Names.add(filterableString); 
      } 
     } 
     Result.values = Filtered_Names; 
     Result.count = Filtered_Names.size(); 

     return Result; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint,FilterResults results) { 
     // TODO Auto-generated method stub 
     pagelist = (ArrayList<String>) results.values; 
     notifyDataSetChanged(); 
    } 

} 

@Override 
public Filter getFilter() { 
    // TODO Auto-generated method stub 

    return new filter_here(); 
} 
} 
+0

Cordeji! Jeśli użyję powyższego kodu, nie ustawi się bałaganu pozycji w taki sam sposób, jak w poprzednim prostym układzie, który wykonaliśmy po zastosowaniu filtra? –

+0

sprawdź to proszę – Coderji

+0

Tak, masz mnie w prawo ... O ListView nie aktualizuje, szybkie wyszukiwanie to dało - Ustaw obiekt adaptera na liście jawnie po zakończeniu filtrowania. Jak umieścić tego szefa? –

1

Określ setOnItemClickListenerlike to:

@Override 
protected void onCreate(Bundle savfedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.indexpage); 
    listView = (ListView) findViewById(R.id.pageList); 
    editTextB = (EditText) findViewById(R.id.searchB); 
    listView.setAdapter(new PagesAdapter(this)); 
    listView.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
     //Your code here 
     //int position is the index of the list item you clicked  
     //use it to manipulate the item for each click  
    } 
}); 
} 
2

dwa różne sposoby na to:

1) Jeśli chcesz użyć coś takiego w onCreate swojej działalności;

listView.setOnItemClickListener((OnItemClickListener) this);

Należy wdrożyć OnItemClickListener do aktywności:

IndexPageActivity extends Activity implements OnItemClickListener 

i realizować swoją metodę onItemClick w swojej działalności. (Również usunąć OnItemClickListener interfejs z niestandardowego adaptera)

2) Można po prostu skorzystać z poniższego bez wdrożenia OnItemClickListener do dowolnej klasy:

listView.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     // TODO: handle row clicks here 
    } 

Proponuję 2nd opcję. To jest łatwiejsze.

Edytuj: To nie dotyczy twojego problemu, ale powinieneś ponownie użyć swoich widoków/wierszy w listView. Zmień metodę getView na:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    if (convertView == null) { 
     LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.single_row, parent, false); 
    } else { 
     view = convertView; 
    } 

    TextView pagetitle = (TextView) view.findViewById(R.id.textViewRow); 

    SingleRow temp=pagelist.get(i); 

    pagetitle.setText(temp.pagedata); 
    return view; 
} 
+0

Dziękuję za Twoją wskazówkę, odpowiedź udzieloną przez Coderji, trochę działa, z wyjątkiem faktu, że lista nie jest aktualizowana po kliknięciu przycisku Backspace lub po otwarciu intencji i wracaniu, ListView nie aktualizuje, czy możesz sprawdzić jego Kod i może pomóc, proszę? Dziękuję Ci. –

Powiązane problemy