Как исправить удаление массива, объявленного в классе Adapter представления переработчика при прокрутке? - PullRequest
0 голосов
/ 01 мая 2019

Я делаю приложение для удаления приложений (система / пользователь). Я успешно реализовал все, что работает в представлении Recycler. Если я выбираю приложение из представления переработчика, его имя пакета копируется в массив (если его еще нет). Если он уже присутствует, он удаляется из массива.

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

public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.ViewHolder> {

Context context1;
List<String> stringList;
String selectedApps[];
private int k;

public AppsAdapter(Context context, List<String> list) {

    context1 = context;
    stringList = list;
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public CardView cardView;
    public ImageView imageView;
    public TextView textView_App_Name;
    public TextView textView_App_Package_Name;
    public CheckBox isAppSelected;

    public ViewHolder(View view) {

        super(view);

        cardView = view.findViewById(R.id.card_view);
        imageView = view.findViewById(R.id.imageview);
        textView_App_Name = view.findViewById(R.id.Apk_Name);
        textView_App_Package_Name = view.findViewById(R.id.Apk_Package_Name);
        isAppSelected = view.findViewById(R.id.isSelected);
    }
}

@Override
public AppsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view2 = LayoutInflater.from(context1).inflate(R.layout.cardview_layout, parent, false);

    ViewHolder viewHolder = new ViewHolder(view2);

    return viewHolder;
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {

    ApkInfoExtractor apkInfoExtractor = new ApkInfoExtractor(context1);
    selectedApps = new String[getNumberofApps()];

    final String ApplicationPackageName = stringList.get(position);
    final String ApplicationLabelName = apkInfoExtractor.GetAppName(ApplicationPackageName);
    Drawable drawable = apkInfoExtractor.getAppIconByPackageName(ApplicationPackageName);

    viewHolder.textView_App_Name.setText(ApplicationLabelName);

    viewHolder.textView_App_Package_Name.setText(ApplicationPackageName);

    viewHolder.imageView.setImageDrawable(drawable);


    //Adding click listener on CardView to open clicked application directly from here .
    viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //Toast.makeText(context1, ApplicationPackageName, Toast.LENGTH_SHORT).show();

            if (!isPresentApp(ApplicationPackageName)) {
                //viewHolder.isAppSelected.setSelected(true);
                selectedApps[k] = ApplicationPackageName;
                ++k;
                Log.d("App: ", ApplicationLabelName);
                Log.d("Number of apps ", Integer.toString(getActuallNumberOfApps()));
                printArray();
            } else {
                // (isPresentApp(ApplicationPackageName)
                //viewHolder.isAppSelected.setSelected(false);
                removeAppfromList(ApplicationPackageName);
                Toast.makeText(context1, "Already present", Toast.LENGTH_SHORT).show();
                Log.d("App removed: ", ApplicationLabelName);
                Log.d("Number of apps ", Integer.toString(getActuallNumberOfApps()));
                printArray();
            }


        }
    });
}

public void removeAppfromList(String applicationPackageName) {

    for (int y = 0; y < selectedApps.length; ++y) {
        if (selectedApps[y] == (applicationPackageName)) {
            for (int z = y; z < selectedApps.length - 1; ++z) {
                selectedApps[z] = selectedApps[z + 1];
            }
            --k;
        }
    }


}

@Override
public int getItemCount() {

    return stringList.size();

}

public int getNumberofApps() {
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> pkgAppsList = context1.getPackageManager().queryIntentActivities(mainIntent, 0);
    int size = pkgAppsList.size();
    return size;
}

public int getActuallNumberOfApps() {
    int y = 0;
    for (int p = 0; p < selectedApps.length; ++p) {
        if (selectedApps[p] != null)
            y++;
    }
    return y;
}

void printArray() {
    for (int u = 0; u < selectedApps.length; ++u) {
        if (selectedApps[u] != null)
            System.out.println(selectedApps[u]);
    }
}

public boolean isPresentApp(String name) {
    int p = 0;

    for (int a = 0; a < selectedApps.length; ++a) {
        if (selectedApps[a] == (name))
            p = 1;

    }
    return p == 1;
}
}

Вот несколько журналов

D / App :: Brave D / Количество приложений: 1 I / System.out: com.brave.browser

D / App :: Camera D / Количество приложений: 2 I / System.out: com.brave.browser I / System.out: com.google.android.GoogleCamera

D / App :: Диск D / Количество приложений: 3 I / System.out: com.brave.browser I / System.out: com.google.android.GoogleCamera I / System.out: com.google. android.apps.docs

Отсюда я начал прокручивать, и он удалил массив.

D / App :: Hangouts D / Количество приложений: 1 I / System.out: com.google.android.talk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...