0

私は各行項目にチェックボックスを持つリストビューを使用するアンドロイドアプリを開発しています。しかし、上下にスクロールすると、ランダムな行がチェックボックスを削除し、リスト全体にチェックボックスが表示されなくなります。私はオンラインチュートリアルで多くのソリューションを試しましたが、どれもうまくいきません。それらはすべて、ViewHolderクラスを使用して表示されます。手伝っていただけませんか?ここでリスト項目のチェックボックスが消えるAndroidリストビューレンダリングエラーを修正するには?

私が提供できるすべてのコードです:

リスト項目のXML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#FFFFFF" 
    android:orientation="vertical" 
    android:paddingBottom="16dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_gravity="center"> 

     <ImageView 
      android:id="@+id/user_image_view" 
      android:layout_width="56dp" 
      android:layout_height="56dp" 
      android:layout_margin="16dp" 
      tools:src="@mipmap/ic_account_circle_bue" /> 

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

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:paddingRight="16dp" 
       android:layout_centerVertical="true"> 

       <TextView 
        android:id="@+id/user_name" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Name" 
        android:textSize="19dp" 
        android:textStyle="bold" 
        android:ellipsize="end" 
        android:maxLines="1" 
        android:textColor="#000000" 
        android:paddingRight="5dp"/> 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal"> 

        <TextView 
         android:id="@+id/user_roll_number" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="Roll Number" 
         android:textSize="15dp" /> 

        <TextView 
         android:id="@+id/user_department" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:paddingLeft="12dp" 
         android:text="Department" 
         android:textSize="15dp" 
         android:maxLines="1" 
         android:ellipsize="end"/> 

       </LinearLayout> 
      </LinearLayout> 

      <CheckBox 
       android:id="@+id/checkbox" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:layout_gravity="center" 
       android:layout_alignParentRight="true" 
       android:layout_centerVertical="true"/> 
     </RelativeLayout> 
    </LinearLayout> 
</LinearLayout> 

はUsersSelection(モデルクラス):

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

/** 
* Created by shubham on 09/05/17. 
*/ 

public class UsersSelection { 
    public Users users; 
    public boolean isSelected; 

    public UsersSelection (Users users, boolean isSelected) { 
     this.users = users; 
     this.isSelected = isSelected; 
    } 

    public Users getUsers() { 
     return users; 
    } 

    public void setUsers(Users users) { 
     this.users = users; 
    } 

    public boolean isSelected() { 
     return isSelected; 
    } 

    public void setSelected(boolean selected) { 
     isSelected = selected; 
    } 
} 

Users.java(カスタムクラス):

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

/** 
* Created by shubham on 23/01/17. 
*/ 

public class Users { 

    String name; 
    String department; 
    String roll; 
    String dpDownloadUri; 

    Users() {} 

    public Users(String name, String department, String roll, String dpDownloadUri) { 
     this.name = name; 
     this.department = department; 
     this.roll = roll; 
     this.dpDownloadUri = dpDownloadUri; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDepartment() { 
     return department; 
    } 

    public void setDepartment(String department) { 
     this.department = department; 
    } 

    public String getRoll() { 
     return roll; 
    } 

    public void setRoll(String roll) { 
     this.roll = roll; 
    } 

    public String getDpDownloadUri() { 
     return dpDownloadUri; 
    } 

    public void setDpDownloadUri(String dpDownloadUri) { 
     this.dpDownloadUri = dpDownloadUri; 
    } 
} 

Cリストビューのカスタムアレイアダプタ:

package com.app.shubhamjhunjhunwala.heritagecompanion_students; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.graphics.Bitmap; 
import android.support.v4.graphics.drawable.RoundedBitmapDrawable; 
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.bumptech.glide.Glide; 

import java.io.FileNotFoundException; 
import java.util.List; 
import java.util.concurrent.ExecutionException; 

/** 
* Created by shubham on 09/05/17. 
*/ 

public class UsersSelectionAdapter extends ArrayAdapter<UsersSelection> { 
    public Context context; 
    public String roll; 
    public boolean isForGroup; 
    public List<GroupMembers> groupMembersList; 
    public List<UsersSelection> list; 

    public CheckBox checkBox; 

    public UsersSelectionAdapter(Context context, int resource, List<UsersSelection> objects) { 
     super(context, resource, objects); 
     this.context = context; 
     list = objects; 
    } 

    public class ViewHolder { 
     TextView nameTextView; 
     TextView rollNumberTextView; 
     TextView departmentTextView; 
     ImageView dpImageView; 
     CheckBox checkBox; 
    } 

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

     SharedPreferences sharedPreferences = ((Activity) getContext()).getSharedPreferences("HCS", 0); 
     roll = sharedPreferences.getString(AuthenticationActivity.ROLL_SHARED_PREFERENCE_KEY, ""); 

     ViewHolder viewHolder = null; 

     if (convertView == null) { 
      convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.user_list_item, parent, false); 

      viewHolder = new ViewHolder(); 

      viewHolder.nameTextView = (TextView) convertView.findViewById(R.id.user_name); 
      viewHolder.departmentTextView = (TextView) convertView.findViewById(R.id.user_department); 
      viewHolder.rollNumberTextView = (TextView) convertView.findViewById(R.id.user_roll_number); 
      viewHolder.dpImageView = (ImageView) convertView.findViewById(R.id.user_image_view); 
      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 

      viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (int) buttonView.getTag(); 
        list.get(getPosition).setSelected(buttonView.isSelected()); 
       } 
      }); 

      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.user_name, viewHolder.nameTextView); 
      convertView.setTag(R.id.user_department, viewHolder.departmentTextView); 
      convertView.setTag(R.id.user_roll_number, viewHolder.rollNumberTextView); 
      convertView.setTag(R.id.user_image_view, viewHolder.dpImageView); 
      convertView.setTag(R.id.checkbox, viewHolder.checkBox); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.checkBox.setTag(position); 

     /*TextView nameTextView = (TextView) convertView.findViewById(R.id.user_name); 
     TextView departmentTextView = (TextView) convertView.findViewById(R.id.user_department); 
     TextView rollNumberTextView = (TextView) convertView.findViewById(R.id.user_roll_number); 
     ImageView dpImageView = (ImageView) convertView.findViewById(R.id.user_image_view); 
     checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);*/ 

     UsersSelection usersSelection = getItem(position); 
     Users user = usersSelection.getUsers(); 

     if (!isForGroup) { 
      viewHolder.checkBox.setVisibility(View.GONE); 
     } else { 
      if (user.getRoll().equals(roll)) { 
       viewHolder.checkBox.setVisibility(View.GONE); 
      } 
     } 

     viewHolder.nameTextView.setText(user.getName()); 
     viewHolder.nameTextView.setTag(usersSelection); 
     viewHolder.departmentTextView.setText(user.getDepartment()); 
     viewHolder.departmentTextView.setTag(usersSelection); 
     viewHolder.rollNumberTextView.setText(user.getRoll()); 
     viewHolder.rollNumberTextView.setTag(usersSelection); 

     viewHolder.checkBox.setChecked(list.get(position).isSelected()); 
     viewHolder.checkBox.setTag(usersSelection); 

     Bitmap bitmap = null; 

     if (!user.getDpDownloadUri().equals("")) { 

      DPAsyncTask dpAsyncTask = new DPAsyncTask(context, viewHolder.dpImageView.getContext(), viewHolder.dpImageView, user); 
      dpAsyncTask.execute(); 

     } else { 

      Glide.clear(viewHolder.dpImageView); 
      viewHolder.dpImageView.setImageDrawable(getContext().getResources().getDrawable(R.mipmap.ic_account_circle_bue)); 

     } 

     return convertView; 
    } 

    public boolean isForGroup() { 
     return isForGroup; 
    } 

    public void setForGroup(boolean forGroup) { 
     isForGroup = forGroup; 
    } 

    public List<GroupMembers> getGroupMembersList() { 
     return groupMembersList; 
    } 

    public void setGroupMembersList(List<GroupMembers> groupMembersList) { 
     this.groupMembersList = groupMembersList; 
    } 

    public CheckBox getCheckBox() { 
     return checkBox; 
    } 

    public void setCheckBox(CheckBox checkBox) { 
     this.checkBox = checkBox; 
    } 
} 

ありがとうございました。あなたが助けを願っ:)

答えて

0
if (!isForGroup) { 
     viewHolder.checkBox.setVisibility(View.GONE); 
    } else { 
     if (user.getRoll().equals(roll)) { 
      viewHolder.checkBox.setVisibility(View.GONE); 
     } 
    } 

あなたしかCheckBoxGONEを作ります。 VISIBLEにリセットされることはありません。

ListViewの背後の点、他のAdapterViewのクラス、およびRecyclerViewはビューをリサイクルすることです。 getView()にウィジェットがある特定の状態にあると仮定することはできません。ウィジェットを変更する(たとえば、表示を変更する)場合は、常にその状態を変更する必要があります。あなたは常に状態CheckBoxが表示すべきか否かように、そのような

if (!isForGroup || user.getRoll().equals(roll)) { 
     viewHolder.checkBox.setVisibility(View.GONE); 
    } else { 
     viewHolder.checkBox.setVisibility(View.VISIBLE); 
    } 

か何か:

だから、上記のコードに変更します。

+0

ありがとうございます。これはうまくいった。それは命の恩人だった:) –

関連する問題