2011-10-15 19 views
18

W zasadzie potrzebuję pomocy lub sugestii z problemem, który mam. Zapełniam widok listy z bazy danych i muszę sprawdzić, kiedy tworzę widok listy, jeśli identyfikator elementu na position jest taki sam jak identyfikator z innej tabeli w mojej bazie danych. Jeśli tak, to możesz kliknąć ten element, jeśli nie chcę, aby go wyłączyć, ale wszystkie informacje, które znalazłem o tym, jak to zrobić ... Nie mogę naprawdę zrozumieć, jak to zrobić.Android wyłącza wyświetlanie list przedmiotów

import java.util.ArrayList; 


import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

//For more information look at the bottom of file. 

public class LazyAdapter extends BaseAdapter { 


    private Activity activity; 
    private String[] data; 
    private ArrayList<String> name; 
    private ArrayList<String> info; 
    private static LayoutInflater inflater=null; 
    public ImageLoader imageLoader; 
    private Bitmap b; 

    public LazyAdapter(Activity a, Bitmap d, ArrayList<String> names, ArrayList<String> information) { 
     activity = a; 
     b=d; 
     name=names; 
     info = information; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader=new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return name.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

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

    public static class ViewHolder{ 
     public TextView name,info; 
     public ImageView image; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     ViewHolder holder; 
     if(convertView==null){ 
      vi = inflater.inflate(R.layout.item, null); 
      holder=new ViewHolder(); 
      holder.name=(TextView)vi.findViewById(R.id.name); 
      holder.info=(TextView)vi.findViewById(R.id.info); 
      holder.image=(ImageView)vi.findViewById(R.id.image); 
      vi.setTag(holder); 
      Log.v("Position","Position : "+position); 
     } 
     else 
      holder=(ViewHolder)vi.getTag(); 
      holder.name.setText(name.get(position)); 
      holder.info.setText(info.get(info.size()-1)); 

      //Here I must do a black magic and get the images if user had 'em. 

      holder.image.setImageBitmap(b); 

      //holder.image.setTag(data[position]); 
      //imageLoader.DisplayImage(data[position], activity, holder.image); 

      // Black magic over. 
     return vi; 
    } 
} 

Wszelkie pomysły i sugestie, jak to zrobić?

+0

co używasz obecnie? Czy zdefiniowałeś niestandardowy adapter dla widoku list? –

+0

Tak, faktycznie używam niestandardowego adaptera. pozwól mi umieścić kod –

+0

można to zrobić, w metodzie getview, umieścić w warunku if i uzyskać identyfikator przedmiotu, jednocześnie wierzę, że masz inną kolekcję, gdzie masz listę identyfikatorów, które można sprawdzić, lub zrobić wybierz zapytanie z identyfikatorem, jeśli licznik wynosi 1, co oznacza, że ​​jest obecny, inaczej nie, jeśli jest obecny, ustaw metodę setEnabled widoku na wartość true, false. (zrób to na kliknięciu pozycji listy) –

Odpowiedz

0

Nie jesteś pewien, co tam robisz, ale chcesz zdefiniować klasę tak, jak zwykle, rozszerzając aktywność (lub aktywność listową). Następnie uczynienie klasy adaptera klasą zagnieżdżoną w klasie Activity przez rozszerzenie BaseAdapter.

Po wykonaniu tej czynności napisz metodę getView() w klasie adaptera. Przypisz OnClickListener do widoku tam, w zależności od warunku, o którym wspomniałeś.

68

W adapterze znajduje się nazwa metody isEnabled, którą można zastąpić. Jest to wywoływane dla każdego wiersza, np. Getview. Onclicklistener uruchomi się tylko wtedy, gdy ta funkcja zwróci true. Więc spróbuj to zrobić w swoim adapterze klienta.

@Override 
public boolean isEnabled(int position) { 
    if(YOUR CONDTITION){ 
     return false; 
    } 
    return true; 
} 
+6

Lub, po prostu: 'return! (YOUR_CONDITION);', gdzie możesz użyć operacji odwrotnych ('! =' kontra '==', aby jeszcze bardziej uprościć). – reece

+3

Dobra odpowiedź. Zastanawiam się, dlaczego to nie zostało zaakceptowane? – Abx

+0

Dokładnie tego szukałem! Jestem zaskoczony, że żaden z tutoriali, które przeczytałem, nie wspomniał o tym. – Aelexe

2

Po przejechaniu listę obiektów do BaseAdpater, dodać pole na tej liście jest obiekt o nazwie IsEnabled i ustawić go na true/false w zależności od potrzeb, a następnie przesłonić metodę IsEnabled z BaseAdapter jak ten

@Override 
public boolean isEnabled(int position) { 

    return info.get(position).isEnabled; 
} 

gdzie informacja jest lista obiektów

2

na przykład, jeśli chcesz wyłączone pozycje od 0 do 5

@Override 
public boolean isEnabled(int position){ 
    if(position >= 0 && position < 6) 
     return false; 
    else 
     return true; 
} 

@Override 
public boolean areAllItemsEnabled(){ 
    return true; 
} 

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

      //CODE OF ADAPTER 
} 
-1

W swoim adapterze dodaj to.

if ((position)!="your item"){ 
    view.setEnabled(true); 
    view.setClickable(true); 
} else{ 
    view.setEnabled(false); 
    view.setClickable(false); 
} 

`

Powiązane problemy