【问题标题】:Buttons and links in ViewHolders are getting mixedViewHolders 中的按钮和链接混杂在一起
【发布时间】:2016-02-28 08:14:38
【问题描述】:

我正在开发一个供人们下载笔记的应用程序... 所以每个 Cardview 中有两个按钮 DownloadShare 按钮 下载按钮和共享按钮混合在一起......我的意思是......有时一个 ViewHolder 的数据会在另一个 ViewHolder 中使用......有时当我单击下载数据时。是从所有视图的同一视图下载的。

这是代码...

package com.razorreborn.csebeta;

import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;

import java.io.File;
import java.util.List;
/**
 *
 * Created by Kiran Anto aka RazorSharp on 2/17/2016.
 * For more Info Contact
 * Kirananto@gmail.com
 * 9495333724
 * All Copyrights Reserved 2016
 *
 */
public class subjectCardAdapter extends RecyclerView.Adapter<subjectCardAdapter.ViewHolder> {

    private final Context context;
    private final List<subjectContent> subjectData;
    DownloadManager downloadManager;
    private String downloadFileUrl;
    private long myDownloadReference;
    private String type;

    public subjectCardAdapter(List<subjectContent> subjectData, Context context){
        super();
        //Getting all the notification
        this.subjectData = subjectData;
        this.context = context;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_subject, parent, false);
            return new ViewHolder(v);
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {

        final subjectContent subjectContent =  subjectData.get(position);
        holder.Name.setText(subjectContent.getName());
        holder.Description.setText(subjectContent.getDescription());
        holder.Type.setText(subjectContent.getType());
        holder.Uploader.setText(subjectContent.getAuthor());
        holder.Date.setText(subjectContent.getDate());
        holder.Description.setMaxLines(5);
        if(Global.Orientation.equals("Landscape")) {
            holder.Name.setTextSize(20);
            holder.Description.setTextSize(13);
        }
        final String DOWNLOAD_MESSAGE = "Download  " + subjectContent.getName() +" of Subject " + Global.subject + " Notes from Here :  " + downloadFileUrl + "\n And to Download this App : \n\n " + Global.AppShare;
        downloadFileUrl = subjectContent.getDownload_link();
        downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        type = downloadFileUrl.substring(downloadFileUrl.indexOf("Downloads/") + 10, downloadFileUrl.length()).replace("%20","");
        final String path = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()+"/"+type;
        Log.i("LOGS : ",path);
        File applicationFile = new File (path);
        if(applicationFile.exists()) {
            holder.download.setText(" Open ");
        }
        holder.download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Add Content To download here...!!!
                if (holder.download.getText().equals("Download")) {
                    Uri uri = Uri.parse(downloadFileUrl);
                    DownloadManager.Request request = new DownloadManager.Request(uri);
                    request.setTitle(subjectContent.getName());
                            request.setDescription(subjectContent.getDescription());
                    request.setDestinationInExternalFilesDir(context.getApplicationContext(),Environment.DIRECTORY_DOWNLOADS,type);
                    myDownloadReference = downloadManager.enqueue(request);

                    CookieSyncManager.createInstance(context);
                    CookieManager cookieManager = CookieManager.getInstance();
                    cookieManager.removeAllCookie();
                    /*Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this there would be crashing coz we dont call from a activity
                context.startActivity(intent);*/
                } else if(holder.download.getText().equals(" Open ")) {
                    File file = new File (path);
                    Intent target = new Intent(Intent.ACTION_VIEW);
                    target.setDataAndNormalize(Uri.fromFile(file));
                    String[] mimetypes = {"application/pdf","text/plain","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.openxmlformats-officedocument.wordprocessingml.document"};
                    target.setType("application/pdf");
                    target.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    target.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
                    Intent intent = Intent.createChooser(target, "Open File");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
                }
        });
        holder.share.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Add Content To download here...!!!
                Intent sharingIntent = new     Intent(android.content.Intent.ACTION_SEND);
                sharingIntent.setType("text/plain");
                sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, DOWNLOAD_MESSAGE);
                sharingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                Intent sharevia = new Intent(Intent.createChooser(sharingIntent, "Share via"));
                sharevia.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(sharevia);
            }
        });
        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO implement onClick for the card here..!
                holder.Description.setMaxLines(100);
            }
        });
    }

    @Override
    public int getItemCount() {
        return subjectData.size();
    }



    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public final TextView Name;
        public final TextView Description;
        public final TextView Type;
        public final TextView Uploader;
        public final TextView Date;
        public final Button download;
        public final ImageButton share;
        public final CardView cardView= (CardView) itemView.findViewById(R.id.card_view_subject);
        //TODO cardview is taken to use it for onClick Events
        public ViewHolder(View itemView) {
            super(itemView);

            Name = (TextView) itemView.findViewById(R.id.text_name);
            Date = (TextView) itemView.findViewById(R.id.upload_date_blank);
            Uploader = (TextView) itemView.findViewById(R.id.uploader_blank);
            Description = (TextView) itemView.findViewById(R.id.text_description);
            Type = (TextView) itemView.findViewById(R.id.textview_type);
            download = (Button) itemView.findViewById(R.id.button);
            share = (ImageButton) itemView.findViewById(R.id.sharebutton);


             }   
            @Override
            public void onClick(View view) {
            }
        }
    }

【问题讨论】:

  • 您已经在 ViewHolder 中实现了 OnClickListener。你不应该点击那里吗?我在 ViewHolder 中没有看到代码 download.setOnClickListener(this)

标签: java android android-studio android-recyclerview


【解决方案1】:

在回收站视图中,视图被重用。您必须意识到,否则事情可能会混淆。调用 onBindViewHolder 时,您必须确保正确设置视图中的所有属性。

例如

if(applicationFile.exists()) {
    holder.download.setText(" Open ");
}

else 分支中的值未设置为“下载”。

【讨论】:

    【解决方案2】:

    现在您将private String downloadFileUrl; 作为成员变量。因此,当您从 onClickListener 引用它时,您指的是不能保证仍然是正确文件 URL 的变量。

    解决此问题的最简单方法是在您的 onClickListener 中使用 subjectContent.getDownload_link();。您通常不想从 onClickListener 中引用成员变量,因为它们会随着新 ViewHolders 的绑定而改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2010-12-23
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多