5

Zdefiniowałem następujący kod, aby móc ustawić tekst w określonej pozycji.ListView setText na określonej pozycji

if(position == 0) { 
       holder.text.setText("blah"); 
      } 

Chciałbym to sprawdzić, czy pozycja jest równa 0, a następnie, jeśli jest ustawiony na pozycji p tekst - za każdym razem, to p = pozycja + 1 (następna pozycja). Czy jesteśmy w stanie ustawić tekst na widok tekstowy od właściciela, ale w określonej pozycji.

Dzięki.

+0

Przez "' '' '' 'odnosi się do pozycji widoku wewnątrz widoku listy? – danypata

+0

@danypata Tak ... Pozycja adaptera – dinomuharemagic

+0

getPosition() i getItem() są tylko w tym przypadku. Tak, możesz tak, że musisz unieważniać za każdym razem, gdy wymieniasz jakiś przedmiot. – RATHI

Odpowiedz

3

Najpierw musisz zaimplementować swój własny RecyclerView.Adapter wewnątrz adaptera, musisz zaimplementować metodę onBindViewHolder(), w której możesz określić tekst zgodnie z pozycją.

Gdy pozycja wynosi 0, otrzymujesz tekst i zapisujesz go w polu String, a gdy pozycja wynosi 1, ustawiasz odpowiednio tekst tego TextView.

public class CustomAdapter extends RecyclerView.Adapter { 

private String tempText; 

... 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if(position == 0) { 
     tempText = "bla"; 
    }else if (position == 1){ 

     holder.text.setText(tempText); 
    } 
} 

}

+0

Mogę ustawić tekst zgodnie z pozycją w moim adapterze listview, pytam, jak mogę ustawić tekst na następnej pozycji, na przykład: 'if (position == 0) { holder.text.setText (" bla "); pozycja 1 uchwyt tekst ustawiany } ' – dinomuharemagic

+0

Czy możesz podać mi konkretne wymagania, proszę, więc mogę zdecydować, co musimy zrobić. Jeśli chcesz ustawić tekst na pozycji 1, dlaczego po prostu go nie użyjemy (pozycja == 1)? –

+0

Nie chcę ustawiać tekstu na pozycji 1, będąc w pozycji (pozycja == 0). Nie mogę zadzwonić, jeśli (pozycja == 1), ponieważ jestem na pozycji 0. – dinomuharemagic

6

myślę, że nadal używa ListView, jeśli nie należy zaktualizować tytule pytanie.

W swojej metodzie getView(int position, View convertView, ViewGroup parent) sprawdź położenie, dla którego tworzony jest widok. Ponieważ używasz już posiadacza, zakładam, że wykonałeś (convertView! = Null) sprawdzenie przed wyodrębnieniem posiadacza.

Tutaj w getView (int pozycji, Widok convertView, ViewGroup dominującej), można sprawdzić

if (position == 0) { 
    holder.text.setText("blah"); 
} else { 
    holder.text.setText(""); 
} 

Pamiętaj wymagana jest częścią innego jak poglądy mają tendencję do ponownego użycia, a więc wcześniej „bla” musi należy go zresetować, inaczej będzie widoczny w innych widokach, gdy widok będzie przewijany.

Aby uzyskać szczegółowe wyjaśnienie, jak działa ponowne wykorzystanie widoków, można sprawdzić ten great talk, w którym Romain Guy wyjaśnia wszystko na temat ListView.

0

W swoim CustomAdapter.class dodać ten kod

public View getView(final int position, View convertView, final ViewGroup parent) { 
ViewHolder holder = new ViewHolder(); 
     holder.txtDetails = (TextView) vi.findViewById(R.id.txt_expenses_details); 
     holder.txtDetails.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ((ListView) parent).performItemClick(v, position, 0); 
      } 
     }); 
     vi.setTag(holder); 
     return vi; 
} 

W swojej MainActivity.class

kliknięcie TextView i zmień wartość

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      long viewId = view.getId(); 
      if (viewId == R.id.txt_expenses_details) { 
       ((TextView)view).setText("Hey, I've just been tapped on!"); 
       customListAdapter.notifyDataSetChanged(); 
      } 
     } 
    }); 

Kliknij ListView i zmiana wartości (lub)

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      TextView tv = (TextView) view.findViewById(R.id.txt_expenses_details); 
      tv.setText(...); 
      customListAdapter.notifyDataSetChanged(); 
     } 
    }); 
1

Uwaga! Korzystając z programu RecycleView, unieważnił on wszystkie widoki na działanie i posiada mechanizm buforowania widoków. Może to powodować problemy przy zmianie Widoku!

Lepsze rozwiązanie, wykorzystuje własny adapter. Albo, najlepsze rozwiązania, użyje Adapter do tego zadania - LinkedListView. Który działa tak samo dobrze jak RecycleView, bu obsługuje również zmianę widoków w dowolnym momencie.

0

Myślę, że aplikacja do ustawiania tekstu w określonej pozycji jest niewłaściwa. Lepszą praktyką kodowania jest zmiana danych.Powiedzmy, że twoja struktura danych jest jak -

class MyData{ 
    public String status; 
} 
ArrayList<MyData> adapterList; 

Teraz, jeśli masz listę MyData do adaptera i chcesz zmienić 5th dane zrób tak -

private void updatePostion(positionToChange = 5){ 
    for(int i = 0; i < adapterList.size(); i++) 
      adapterList.get(i).status = ""; 
    adapterList.get(positionToChange).status = "blah"; 
    notifyDataSetChanged(); 
} 

nadzieję, że pomoże :)

1

musisz zaktualizować dane na liście wewnątrz metody getView() i nie martw się o pozycję, ponieważ zwiększy się automatycznie.

public class ViewHolder 
    { 
     TextView text; 
    } 

public View getView(final int position, View rView, ViewGroup parent) 
    { 
     currentPosition = position; 
     rowView =rView; 


     if(rowView == null) 
     { 
      LayoutInflater inflater = LayoutInflater.from(context); 
      rowView= inflater.inflate(R.layout.list_item_layout, null); 
      viewHolder = new ViewHolder(); 

      viewHolder.text= (TextView) rowView.findViewById(R.id.textView); 

      rowView.setTag(viewHolder); 
     } 
     else 
     { 
      viewHolder = (ViewHolder) rowView.getTag(); 
     } 
     if(position==0){ 
      viewHolder.text.setText("your Text"); 
     } 
     else if(position==1){ 
      viewHolder.text.setText("your Text 1"); 
     } 
     notifyDataSetChanged();//this will update your views 
} 
Powiązane problemy