Android自定义数组适配器getView获取错误的ID(列表视图中的下一个)

时间:2016-10-14 11:20:03

标签: android listview adapter

大家好,

也许这是一个简单和/或愚蠢的问题但是因为它让我发疯了我发帖。

我在名为CoursFindAdapter的类中有 Listview 自定义ArrayAdapter ,getView是这样的:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
this.parent = parent;

if(convertView == null){
    convertView = LayoutInflater.from(getContext()).inflate(R.layout.cours_find,parent, false);
}


final Cours cours = getItem(position);
telephone = cours.getTelephone();
email = cours.getEmail();
latitude = (long)cours.getLatitude();
longitude = (long)cours.getLongitude();
code = cours.getCode();
id_cours = cours.getId();
tarif = String.valueOf(cours.getTarif());
specialite = cours.getSpecialite();
prenom = cours.getPrenom();
nom = cours.getNom();
titre = cours.getTitre();
description = cours.getDescription();
reserve = cours.getReserve();



SharedPreferences prefs = getContext().getSharedPreferences(
        "com.learnys.android", Context.MODE_PRIVATE);

String container = "com.learnys.android.id";
id_etudiant = prefs.getString(container, "0");




CoursViewHolder viewHolder = (CoursViewHolder) convertView.getTag();
if(viewHolder == null){
    viewHolder = new CoursViewHolder();
    viewHolder.titre = (TextView) convertView.findViewById(R.id.titre);
    viewHolder.description = (TextView) convertView.findViewById(R.id.description);
    viewHolder.codepostal = (TextView) convertView.findViewById(R.id.codepostal);
    viewHolder.ville = (TextView) convertView.findViewById(R.id.ville);
    viewHolder.tarif = (TextView) convertView.findViewById(R.id.tarif);
    viewHolder.nom = (TextView) convertView.findViewById(R.id.nom);
    viewHolder.prenom = (TextView) convertView.findViewById(R.id.prenom);
    viewHolder.specialite = (TextView) convertView.findViewById(R.id.specialite);
    viewHolder.distance = (TextView) convertView.findViewById(R.id.distance);
    viewHolder.choice = (Button) convertView.findViewById(R.id.choice);

    convertView.setTag(viewHolder);
}else {
    viewHolder = (CoursViewHolder) convertView.getTag();
}


viewHolder.titre.setText(Html.fromHtml("<html><body><font size=10 color=red>Cours: </font> " + cours.getTitre() + " </body><html>"));
viewHolder.description.setText(Html.fromHtml("<html><body><font size=10 color=red>Description: </font> "+cours.getDescription()+" </body><html>"));
viewHolder.codepostal.setText(Html.fromHtml("<html><body><font size=10 color=red>Code Postal: </font> "+String.valueOf(cours.getCodepostal())+" </body><html>"));
viewHolder.ville.setText(Html.fromHtml("<html><body><font size=10 color=red>Ville: </font> "+cours.getVille()+" </body><html>"));
viewHolder.tarif.setText(Html.fromHtml("<html><body><font size=10 color=red>Tarif: </font> "+String.valueOf(cours.getTarif())+" </body><html>"));
viewHolder.nom.setText(Html.fromHtml("<html><body><font size=10 color=red>Nom Professeur: </font> "+cours.getNom()+" </body><html>"));
viewHolder.prenom.setText(Html.fromHtml("<html><body><font size=10 color=red>Prénom Professeur: </font> " + cours.getPrenom() + " </body><html>"));
viewHolder.specialite.setText(Html.fromHtml("<html><body><font size=10 color=red>Spécialité Professeur: </font> "+cours.getSpecialite()+" </body><html>"));
viewHolder.distance.setText(Html.fromHtml("<html><body><font size=10 color=red>Distance: </font> " + cours.getDistance() + " <font size=10 color=red>Temps: </font> " + cours.getTime()  + " </body><html>"));


if (cours.getEtudiant() == Integer.valueOf(id_etudiant)){
    viewHolder.choice.setText("Cours réservé");
    viewHolder.choice.setTextColor(Color.BLACK);
    ///viewHolder.code.setClickable(false);
    viewHolder.choice.setEnabled(false);
}else {

    viewHolder.choice.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Activity origin = (Activity) getContext();
            Intent myIntent = new Intent(origin, PayPalActivity.class);
            myIntent.putExtra("id_cours", id_cours);
            myIntent.putExtra("id_etudiant", id_etudiant);
            myIntent.putExtra("tarif", tarif);
            myIntent.putExtra("specialite", specialite);
            myIntent.putExtra("description", description);
            myIntent.putExtra("prenom", prenom);
            myIntent.putExtra("nom", nom);
            myIntent.putExtra("telephone", telephone);
            myIntent.putExtra("email", email);
            myIntent.putExtra("titre", titre);
            myIntent.putExtra("code", code);
            myIntent.putExtra("cours", cours);
            getContext().startActivity(myIntent);


        }


    });

}

return convertView;
}

视图持有者类:

public class CoursViewHolder{
public TextView titre;
public TextView description;
public TextView codepostal;
public TextView ville;
public TextView tarif;
public TextView nom;
public TextView prenom;
public TextView specialite;
public String email;
public String telephone;
public long latitude;
public long longitude;
public String code;
public Button choice;
public TextView distance;
}

由另一个类填充:

CoursFindAdapter adapter = new CoursFindAdapter(getActivity(),  
cours,getActivity(), page);
adapter.setContext(getActivity());
listView.setAdapter(adapter);

自定义适配器的XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
>
<TextView
    android:id="@+id/titre"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Titre"
    android:layout_alignParentTop="true"
    android:layout_alignRight="@+id/description"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />
<TextView
    android:id="@+id/description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Description"
    android:layout_below="@+id/titre"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:id="@+id/ville"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Ville"
    android:layout_below="@+id/description"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />
<TextView
    android:id="@+id/tarif"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Tarif"
    android:layout_below="@+id/codepostal"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:id="@+id/nom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Nom"
    android:layout_below="@+id/tarif"
    android:layout_alignLeft="@+id/tarif"
    android:layout_alignStart="@+id/tarif" />

<TextView
    android:id="@+id/prenom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Prenom"
    android:layout_below="@+id/nom"
    android:layout_alignLeft="@+id/nom"
    android:layout_alignStart="@+id/nom" />

<TextView
    android:id="@+id/specialite"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Specialité"
    android:layout_below="@+id/prenom"
    android:layout_alignLeft="@+id/prenom"
    android:layout_alignStart="@+id/prenom" />

<TextView
    android:id="@+id/distance"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    tools:text="Distance"
    android:layout_below="@+id/specialite"
    android:layout_alignLeft="@+id/specialite"
    android:layout_alignStart="@+id/specialite" />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Choisir"
    android:id="@+id/choice"
    style="@style/MaterialButton"
    android:layout_below="@+id/distance"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="25dp" />
<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_below="@+id/choice"
    android:background="@android:color/darker_gray"/>

<TextView
    tools:text="Code Postal"
    android:id="@+id/codepostal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    android:layout_below="@+id/ville"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

</RelativeLayout>

每次点击按钮按钮列表中的项目时,PayPalActivity类的数据发布始终是与之相关的数据列表中的下一个ID 。有时但不经常是它采取正确的数据(仅在列表的第一项)。

我很害羞我做错了什么;实现,XML或其他东西我无法理解,因为我在另一个活动上使用类似的代码,并且预计工作正常: - (

我尝试了很多东西,包括删除这部分代码而没有成功地删除整个数据:

if (Integer.valueOf(reserve) == 1 && cours.getEtudiant() != Integer.valueOf(id_etudiant)) {
    convertView.setVisibility(View.INVISIBLE);
}
else if (cours.getEtudiant() == Integer.valueOf(id_etudiant)){
    viewHolder.choice.setText("Cours réservé");
    viewHolder.choice.setTextColor(Color.BLACK);
    ///viewHolder.code.setClickable(false);
    viewHolder.choice.setEnabled(false);
}

我陷入了愚蠢的境地,我现在不知道该怎么做,非常感谢任何帮助。

[编辑]我注意到如果我在某个位置(不显示列表中下一个项目的任何像素),结果就可以,但我认为这不是正确的行为:正确的行为应该是:'即使项目没有完全显示,项目'的一个按钮选项也应该驱动整个项目的数据(重要的是与项目相关的按钮) 关心所有人并感谢您阅读此问题: - )

1 个答案:

答案 0 :(得分:1)

您的问题很简单:您在onClickListener()

中使用了过时的数据

所以你需要做的就是

viewHolder.choice.setTag(position);
viewHolder.choice.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Cours c = getItem((int) view.getTag());
        Activity origin = (Activity) getContext();
        Intent myIntent = new Intent(origin, PayPalActivity.class);
        myIntent.putExtra("id_cours", c.getId());
        myIntent.putExtra("id_etudiant", id_etudiant);
        myIntent.putExtra("tarif", String.valueOf(c.getTarif()));
        myIntent.putExtra("specialite", c.getSpecialite());
        myIntent.putExtra("description", c.getDescription());
        .
        .
        .
        myIntent.putExtra("cours", c);
        getContext().startActivity(myIntent);
    }
});

发生的事情是,每次调用getView()时,您的数据都会更新,即直到所有视图都已布局为止。单击某个项目时,值将更改。因此,您将从getView()迭代中获取最后一个值。

此外,您可能不想使用cours中的所有字段,而是使用cours.getId()等,而我确信这不会影响您的效果。