2

Я не могу установить свойство setText текста в getView() метод пользовательского адаптера.Проблема с настройкой текста Textview в пользовательском адаптере для Android

Я уже попробовал ниже решений, но это не работает для меня:

Listview.xml файл:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/imgLayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ListView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="40dp" 
    android:divider="@null" 
    android:dividerHeight="5dp" 
    android:scrollbars="none" /> 

</RelativeLayout> 

Ниже мой keep_resing XML файл:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/customRowLayout" 
android:layout_width="fill_parent" 
android:layout_height="60dp" 
android:layout_marginTop="20dp" 
android:orientation="horizontal" > 

<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:orientation="vertical" > 

     <ImageButton 
      android:id="@+id/Btn" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginLeft="10dp" 
      android:background="@drawable/thumb_down_disabled" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_horizontal" 
      android:text="@string/resing" 
      android:textColor="#357EC7" 
      android:textSize="10sp" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/lyricsTxt" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" /> 

     <RelativeLayout 
      android:id="@+id/parentLayout" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_marginTop="5dp" 
      android:background="@drawable/playing_view" 
      android:orientation="horizontal" > 

      <TextView 
       android:id="@+id/helloTxt" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerInParent="true" 
       android:layout_marginLeft="5dp" 
       android:singleLine="true" 
       android:text="Hello" 
       android:textColor="#357EC7" 
       android:textSize="14sp" /> 

      <ImageView 
       android:layout_width="20dp" 
       android:layout_height="20dp" 
       android:layout_alignParentRight="true" 
       android:layout_centerVertical="true" 
       android:layout_marginRight="5dp" 
       android:background="@drawable/volume" /> 
     </RelativeLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:orientation="vertical" > 

     <ImageButton 
      android:id="@+id/keepBtn" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginRight="10dp" 
      android:background="@drawable/thumb_up_disabled" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_horizontal" 
      android:text="@string/keep" 
      android:textColor="#357EC7" 
      android:textSize="10sp" /> 
    </LinearLayout> 
</RelativeLayout> 

Ниже мой адаптер код:

import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import org.simpleframework.xml.stream.Position; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.AssetFileDescriptor; 
import android.content.res.Resources; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Handler; 
import android.os.PowerManager; 
import android.sax.StartElementListener; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 


public class KeepReSingAdapter extends BaseAdapter implements OnClickListener { 

    /*********** Declare Used Variables *********/ 
    private Activity activity; 
    private ArrayList data; 
    private static LayoutInflater inflater = null; 
    public Resources res; 
    SongCue tempValues = null; 
    int i = 0; 

    private ArrayList<SongCue> songCue; 
    private int cueIndex = 0; 
    private String selectedSongId; 
    private MediaPlayer mMediaPlayer; 
    ViewHolder holder; 
    View vi; 
    boolean right_button_flag, left_button_flag; 
    SessionManager session; 

    // int left_button_flag; 

    /************* CustomAdapter Constructor *****************/ 
    public KeepReSingAdapter(Activity a, ArrayList d, Resources resLocal) { 

     /********** Take passed values **********/ 
     activity = a; 
     data = d; 
     res = resLocal; 

     /*********** Layout inflator to call external xml layout() ***********/ 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 



     selectedSongId = SessionManager.getInstance(
       activity.getApplicationContext()).getString(
       AppConstants.SONG_ID); 

     right_button_flag = false; 
     left_button_flag = false; 

     // Session class instance 
     session = new SessionManager(activity.getApplicationContext()); 

    } 

    /******** What is the size of Passed Arraylist Size ************/ 
    public int getCount() { 

     if (data.size() <= 0) 
      return 1; 
     return data.size(); 
    } 

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

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

    /********* Create a holder Class to contain inflated xml file elements *********/ 
    public static class ViewHolder { 

     public TextView lyricsTxt, helloTxt; 
     // public TextView text1; 
     public ImageButton leftBtn, rightBtn; 
     public RelativeLayout parentLayout; 
     public LinearLayout rowLayout; 

     // public TextView textWide; 
     // ImageView image; 

    } 

    /****** Depends upon data size called for each row , Create each ListView row *****/ 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     vi = convertView; 

     if (convertView == null) { 

      vi = inflater.inflate(R.layout.keep_resing, null); 

      holder = new ViewHolder(); 
      holder.lyricsTxt = (TextView) vi.findViewById(R.id.lyricsTxt); 
      holder.helloTxt = (TextView) vi.findViewById(R.id.helloTxt); 

      holder.leftBtn = (ImageButton) vi.findViewById(R.id.reSingBtn); 
      holder.rightBtn = (ImageButton) vi.findViewById(R.id.keepBtn); 
      holder.parentLayout = (RelativeLayout) vi 
        .findViewById(R.id.parentLayout); 
      holder.rowLayout = (LinearLayout) vi 
        .findViewById(R.id.customRowLayout); 





      vi.setTag(holder); 

     } else { 
      holder = (ViewHolder) vi.getTag(); 

     } 

     if (data.size() <= 0) { 



     } else { 
      /***** Get each Model object from Arraylist ********/ 
      tempValues = null; 
      tempValues = (SongCue) data.get(position); 


      holder.lyricsTxt.setText(tempValues.getLyric()); 

      List<Song> AllSong = SplashScreen_Activity.songs; 
      if (selectedSongId != null) { 
       for (Song tempsong : AllSong) { 
        if (tempsong.songId.equals(selectedSongId)) { 
         songCue = (ArrayList<SongCue>) tempsong.songCues.songCue; 
        } 
       } 
      } else { 

      } 




      holder.parentLayout.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 

       Toast.makeText(activity.getApplicationContext(), 
         " " + position, Toast.LENGTH_SHORT).show(); 

        holder.helloTxt.setText("Test"); 

        Toast.makeText(activity.getApplicationContext(), 
          holder.helloTxt.getText().toString(), 
          Toast.LENGTH_LONG).show(); 


        } 
       }); 



     } 
     vi.setOnClickListener(new OnItemClickListener(position)); 
     return vi; 
    } 


    @Override 
    public void onClick(View v) { 
     Log.v("CustomAdapter", "=====Row button clicked====="); 

    } 

    /********* Called when Item click in ListView ************/ 
    private class OnItemClickListener implements OnClickListener { 
     private int mPosition; 

     OnItemClickListener(int position) { 
      mPosition = position; 
     } 

     @Override 
     public void onClick(View arg0) { 


     } 
    } 

} 

Проблема, я не могу изменить текст просмотра текста "Тест" ,

Примечание: Если я вижу значение в Toast, делая «holder.helloTxt.getText().toString()» он показывает мне «Test».

Я не знаю, почему эта проблема возникает. Любая помощь будет высоко оценена.

Благодаря

+1

вы не должны положить setOnClickListener вне если (convertView == NULL)? –

+0

добавьте макет вашего списка –

+0

@ LucianoRodríguez: Первоначально это было похоже только, но это тоже не сработало. –

ответ

4

Наконец-то я получил решение своего вопроса и догадался, что это было незначительное обновление кода.

Я обновил свой код:

final ViewHolder holder; 

внутри getView() из CustomAdapter вместо того, чтобы объявить его во всем мире.

Еще раз благодарим всех вас за ответы.

Это помогло мне детально изучить мой код.

+0

Я только что принял ответ ypur, но вы можете объяснить мне, почему после создания окончательного класса код работает. –

+1

@SalmanKhan Я сталкиваюсь с той же проблемой, поэтому я добираюсь до этой записи. Добавление «финала» решило мою проблему, и я знаю, почему это происходит. Метод getView вызывается, когда listview загружается в первый раз или когда вы просматриваете список, чтобы некоторые новые элементы отображались (исчезали) в списке. Поэтому, когда вы нажимаете его, метод getView НЕ вызывается, но вызывается метод onClick. Поскольку вы только устанавливаете объект-держатель, чтобы содержать различные элементы в методе getView, когда вы просто нажимаете его, объект-держатель не содержит ничего. – eepty

+1

@SalmanKhan (... здесь не так много символов). Если вы объявите держателя окончательным, когда сначала будет вызван getView, объект-держатель будет создан и настроен на отображение TextView и станет окончательным. Поэтому, когда вы нажимаете его позже, держатель по-прежнему содержит этот TextView. – eepty

0

ли вы выполнить holder = vi.getTag(); в случае, если не convertView является нулевым? Это необходимо, если представление уже создано, чтобы повторно инициализировать его в состоянии, в котором оно было.

0

Проблема в том, что я не могу изменить текст в текстовом виде на «Тест».

Вы делаете это неправильно. Допустим, ваш адаптер сделан из String. То, что я бы ожидать,

if (convertView == null) { 
    // inflate stuff 
    // create older 
    // set the older in the converView's tag 
    } else { 
    // retriewholder 
    } 
    // here you set the String in the holder at position: 
    String tmpString = getItem(position); 
    holder.helloTxt.setText(tmpString); 
    holder.parentLayout.setTag(position); 

Внутри OnClick, вы можете получить позицию корыта объекта тегов, и обновить строку в наборе данных и вызвать notifyDataSetChanged

1

Попробуйте эту надежду, что это помогает

vi = convertView; 
    if (vi == null) { 
     vi = inflater.inflate(R.layout.xmlfile, null); 
     holder = new ViewHolder(); 
     holder.helloTxt= (TextView) vi.findViewById(R.id.hearTxt); 
     holder.parentLayout= (RelativeLayout) vi 
       .findViewById(R.id.parentLayout); 

     vi.setTag(holder); 
    }else 
     holder=(ViewHolder)vi.getTag(); 

     holder.parentLayout.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Toast.makeText(activity.getApplicationContext(), 
         " " + position, Toast.LENGTH_SHORT).show(); 

        holder.helloTxt.setText("Test");// not required 
        // just change the value of text in your list(which you are passing to the adapter) at corresponding position and then notify the list 
        notifyDataSetChanged(); 

        Toast.makeText(activity.getApplicationContext(), 
          holder.helloTxt.getText().toString(), 
          Toast.LENGTH_LONG).show(); 


      } 
     }); 

     return vi; 

Он отобразит текст «тест», но при прокрутке он снова изменится на свое первоначальное значение, поэтому вам нужно будет изменить значение в списке, который вы отправляете на адаптер

Также в вашем случае проблема заключается в том, что при обновлении текста вашего TextView он обновляется до сих пор, поэтому вы получаете текст TextView в своем Toast. Но чтобы показать обновленный текст в ListView, вы должны уведомить Список. Но когда вы это сделаете, ваш TextView сбрасывается до исходного значения.Так что все, что вам нужно сделать, это принять глобальную переменную типа String и intialise, что к вашему исходному значению, что вы хотите, как этот

private String yourText="initial text" 

и GetView() установите текст TextView этой переменной, как этот

holder.helloTxt.setText(yourText); 

и когда вы щелкните parentLayout, просто присвоить, эту строку значение, которое вы хотите и уведомить список

yourText="test"; 
notifyDataSetChanged(); 

и это будет делать трюк. Но помните, что это работает только тогда, когда у вас есть одна строка, если у вас несколько строк, вам нужно взять массив String.

+0

Это не работает. Он не меняет текст. –

+0

Вы изменили значение в своем списке, которое вы передаете адаптеру? –

+0

На самом деле, моя проблема заключается в том, что у меня есть элемент списка и внутри, что у меня есть относительный макет, который содержит текстовое представление. Теперь, щелкнув по относительной компоновке, я хочу изменить текстовые представления text.So, мой текст будет статичным. –

0

Ваша проблема в том, что вы не касались родительского макета. Убедитесь, что ваш палец может касаться parentLayout, вы можете добавить для него дополнение. Или вы можете попробовать

holder.helloTxt.setOnClickListener(...) 

вместо parentLayout.

0

Я видел много способов, но для меня простой способ - это переходный компонентный вид на адаптер. Тогда вы можете изменить, что вам нужно. См пример ниже:

Link