【问题标题】:OnClickListener doesn't work in custom listviewOnClickListener 在自定义列表视图中不起作用
【发布时间】:2014-10-19 09:14:48
【问题描述】:

我尝试在自定义列表视图中使用OnClickListener,但是当单击文本视图时(Onclicklistener Run)它正在列表视图中的几个文本视图上运行代码! 在我的ListAdapter.class 中查看holder.tvComment.setOnClickListener 已更新

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.skyline.jimmy.widget.LikeToast;
import com.skyline.jimmy.widget.MyToast;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
//import android.text.ClipboardManager;
import android.content.ClipboardManager;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

public class VoteListAdapter extends BaseAdapter {

    protected static final String CLIPBOARD_SERVICE = null;
    private final String TAG = "*** VoteListAdapter ***";
    private Context context;
    private ArrayList<Vote> votes;
    int showHideBtn = 0;
    public VoteListAdapter(Context context,List<Vote> voteList) {
        this.context =context;
        this.votes =(ArrayList<Vote>) voteList;

    }

    @Override
    public int getCount() {
        return votes.size();
    }

    @Override
    public Object getItem(int position) {
        return votes.get(position);
    }

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


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder      = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.row, null);
            holder.tvName      = (TextView) convertView.findViewById(R.id.user);
            holder.tvComment   = (TextView) convertView.findViewById(R.id.tvComment);
            holder.tvDate      = (TextView) convertView.findViewById(R.id.tDate);
            holder.tvLikes      = (TextView) convertView.findViewById(R.id.tvLikes);
            holder.ratingBar   = (RatingBar)convertView.findViewById(R.id.ratingBar);
            holder.share   = (ImageButton) convertView.findViewById(R.id.sharebtn);
            holder.copyJoke  = (ImageButton) convertView.findViewById(R.id.copyJoke);
            holder.btnLike  = (Button) convertView.findViewById(R.id.likebtn);
            holder.btnLiked  = (Button) convertView.findViewById(R.id.likedbtn);
            holder.btns   = (ImageButton) convertView.findViewById(R.id.btns);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Typeface yaghut=Typeface.createFromAsset(context.getAssets(), "font/Far_Casablanca.ttf");
        String likes = Integer.parseInt(votes.get(position).getRate()) + " likes";
        holder.tvName.setText(votes.get(position).getName());
        holder.tvComment.setText(votes.get(position).getComment());
        holder.tvDate.setText(getFormatedDate(votes.get(position).getPublishDate()));
        holder.tvLikes.setText(likes);
        holder.ratingBar.setRating(Integer.parseInt(votes.get(position).getRate()));
        holder.tvComment.setTypeface(yaghut);
        if (convertView == null) {

            holder.tvComment.setOnClickListener( new OnClickListener() {
                int clicks = 0;
                @Override
                public void onClick(View v) {

                    clicks = clicks + 1;
                    if(clicks == 1){

                    }else if(clicks == 2) {
                        LikeToast.makeText(context, "Liked" , Toast.LENGTH_SHORT).show();
                        holder.btnLike.setText("Liked");
                        Drawable image = context.getResources().getDrawable( R.drawable.ic_action_liked );
                        int hlike = image.getIntrinsicHeight(); 
                        int wlike = image.getIntrinsicWidth();   
                        image.setBounds( 0, 0, wlike, hlike );
                        holder.btnLike.setCompoundDrawables( image, null, null, null );
                        //holder.btnLikes.setBackgroundDrawable(R.drawable.ic_action_liked);
                    } else{
                       clicks = 2;
                   }
                }
            });
               convertView.setTag(holder);
            }
        holder.btns.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {



                if(showHideBtn == 1){

                    holder.share.setVisibility(View.INVISIBLE);
                    holder.btns.setVisibility(View.VISIBLE);
                    holder.copyJoke.setVisibility(View.INVISIBLE);

                    showHideBtn = 0;

                } else {

                    holder.share.setVisibility(View.VISIBLE);
                    holder.btns.setVisibility(View.VISIBLE);
                    holder.copyJoke.setVisibility(View.VISIBLE);
                    showHideBtn = 1;
                }
            }
        });



        holder.copyJoke.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {

                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                String Joke = votes.get(position).getComment();
                clipboard.setText(Joke);

                Toast toast3 = MyToast.makeText(context, "جک مورد نظر کپی شد", Toast.LENGTH_SHORT);
                toast3.show();

            }
        });

        holder.share.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {
               /* Intent i = new Intent(Intent.ACTION_SEND);
                i.setType("text/plain");
                i.putExtra(Intent.EXTRA_TEXT,votes.get(position).getComment());
                try {
                    context.startActivity(Intent.createChooser(i, "Share"));
                } catch (android.content.ActivityNotFoundException ex) {
                    ex.printStackTrace();
                }
               */

                Toast toast = MyToast.makeText(context, "این قسمت در نسخه بتا در حال طراحی است", Toast.LENGTH_LONG);
                toast.show();
                Toast toast2 = MyToast.makeText(context, "منتظر آپدیت باشید", Toast.LENGTH_SHORT);
                toast2.show();
            }
        });


        return convertView;
    }




    private String getFormatedDate(String date) {
        String myDate = null;

        try {
            Date oldDate = new SimpleDateFormat("yy-mm-dd hh:mm:ss").parse(date);
            myDate = new SimpleDateFormat("dd MMM yyyy").format(oldDate);
        } catch (ParseException e) {
            myDate = "";
            e.printStackTrace();
        }

        return myDate;
    }



    static class ViewHolder {
        ImageButton copyJoke;
        ImageButton share;
        ImageButton btns;
        Button btnLike;
        Button btnLiked;
        TextView  tvName;
        TextView  tvLikes;
        TextView  tvComment;
        TextView  tvDate;
        RatingBar ratingBar;
    }
}

【问题讨论】:

  • 删除 btns 的 setFocusable 和 setFocusableInTouchMode .. 并尝试..
  • @ArpitPatel 我试试,但没关系

标签: java android listview android-listview


【解决方案1】:

将您的 setOnClickListener 代码写入 if 条件

if (convertView == null) {
   .....
   .....
   // write here your holder.tvComment.setOnClickListener

   convertView.setTag(holder);
}

在这一行之前:

convertView.setTag(holder);

您的完整适配器应该是这样的:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.skyline.jimmy.widget.LikeToast;
import com.skyline.jimmy.widget.MyToast;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.content.ClipData;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
//import android.text.ClipboardManager;
import android.content.ClipboardManager;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

public class VoteListAdapter extends BaseAdapter {

    ViewHolder holder;
    protected static final String CLIPBOARD_SERVICE = null;
    private final String TAG = "*** VoteListAdapter ***";
    private Context context;
    private ArrayList<Vote> votes;
    int showHideBtn = 0;
    public VoteListAdapter(Context context,List<Vote> voteList) {
        this.context =context;
        this.votes =(ArrayList<Vote>) voteList;

    }

    @Override
    public int getCount() {
        return votes.size();
    }

    @Override
    public Object getItem(int position) {
        return votes.get(position);
    }

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

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

        if (convertView == null) {
            holder      = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.row, null);
            holder.tvName      = (TextView) convertView.findViewById(R.id.user);
            holder.tvComment   = (TextView) convertView.findViewById(R.id.tvComment);
            holder.tvDate      = (TextView) convertView.findViewById(R.id.tDate);
            holder.tvLikes      = (TextView) convertView.findViewById(R.id.tvLikes);
            holder.ratingBar   = (RatingBar)convertView.findViewById(R.id.ratingBar);
            holder.share   = (ImageButton) convertView.findViewById(R.id.sharebtn);
            holder.copyJoke  = (ImageButton) convertView.findViewById(R.id.copyJoke);
            holder.btnLike  = (Button) convertView.findViewById(R.id.likebtn);
            holder.btnLiked  = (Button) convertView.findViewById(R.id.likedbtn);
            holder.btns   = (ImageButton) convertView.findViewById(R.id.btns);


            holder.btns.setOnClickListener( new OnClickListener() {

                @Override
                public void onClick(View v) {



                    if(showHideBtn == 1){

                        holder.share.setVisibility(View.INVISIBLE);
                        holder.btns.setVisibility(View.VISIBLE);
                        holder.copyJoke.setVisibility(View.INVISIBLE);

                        showHideBtn = 0;

                    } else {

                        holder.share.setVisibility(View.VISIBLE);
                        holder.btns.setVisibility(View.VISIBLE);
                        holder.copyJoke.setVisibility(View.VISIBLE);
                        showHideBtn = 1;
                    }
                }
            });



        holder.copyJoke.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {

                android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
                String Joke = votes.get(position).getComment();
                clipboard.setText(Joke);

                Toast toast3 = MyToast.makeText(context, "جک مورد نظر کپی شد", Toast.LENGTH_SHORT);
                toast3.show();

            }
        });

        holder.share.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {
               /* Intent i = new Intent(Intent.ACTION_SEND);
                i.setType("text/plain");
                i.putExtra(Intent.EXTRA_TEXT,votes.get(position).getComment());
                try {
                    context.startActivity(Intent.createChooser(i, "Share"));
                } catch (android.content.ActivityNotFoundException ex) {
                    ex.printStackTrace();
                }
               */

                Toast toast = MyToast.makeText(context, "این قسمت در نسخه بتا در حال طراحی است", Toast.LENGTH_LONG);
                toast.show();
                Toast toast2 = MyToast.makeText(context, "منتظر آپدیت باشید", Toast.LENGTH_SHORT);
                toast2.show();
            }
        });


            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Typeface yaghut=Typeface.createFromAsset(context.getAssets(), "font/Far_Casablanca.ttf");
        String likes = Integer.parseInt(votes.get(position).getRate()) + " likes";
        holder.tvName.setText(votes.get(position).getName());
        holder.tvComment.setText(votes.get(position).getComment());
        holder.tvDate.setText(getFormatedDate(votes.get(position).getPublishDate()));
        holder.tvLikes.setText(likes);
        holder.ratingBar.setRating(Integer.parseInt(votes.get(position).getRate()));
        holder.tvComment.setTypeface(yaghut);


        return convertView;
    }

    private String getFormatedDate(String date) {
        String myDate = null;

        try {
            Date oldDate = new SimpleDateFormat("yy-mm-dd hh:mm:ss").parse(date);
            myDate = new SimpleDateFormat("dd MMM yyyy").format(oldDate);
        } catch (ParseException e) {
            myDate = "";
            e.printStackTrace();
        }

        return myDate;
    }



    static class ViewHolder {
        ImageButton copyJoke;
        ImageButton share;
        ImageButton btns;
        Button btnLike;
        Button btnLiked;
        TextView  tvName;
        TextView  tvLikes;
        TextView  tvComment;
        TextView  tvDate;
        RatingBar ratingBar;
    }
}

【讨论】:

  • 现在 OnCliclListener 不起作用并且 eclipse 显示 Dead Code! :(
  • 删除这一行:holder.tvComment.setFocusableInTouchMode(false);这段代码对我有用
  • 我试试,但它说死代码!我更新了我的帖子,请再次查看我的代码:-(
  • tnx 兄弟,但是当我单击 tvComment 应该更改 tvlikes 背景时,它发生了变化,但列表视图中的其他一些行也发生了变化!我真的不知道该做什么:-(
  • 对不起,我不能因为我应该有 15 声望! :|但是当我有 15 个声望时(!)我投票给你 :D !!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多