如何在自定义列表视图中使用单个布局的按钮

时间:2017-02-27 03:39:56

标签: android listview

我试图在自定义适配器中显示所有问题。我也为upvote和downvote设置了箭头。这个问题很好地展示了 以自定义形式。问题是,当我单击列表中任何元素的upvote按钮时,最后一项的upvote功能就完成了。 我需要对点击按钮的特定问题进行投票。为了检查它,我在upvote按钮上保持一个吐司,以便它显示 该元素的问题,但结果是它只显示了最后一项。

此处给出了代码

 public class CustomForumAdapter extends ArrayAdapter {

    List<Question> mList;
    Context mContext;
    LayoutInflater inflater;


    public CustomForumAdapter(Context context, List<Question> list) {
        super(context, R.layout.design_forum, list);
        mContext = context;
        mList = list;


    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        inflater = LayoutInflater.from(mContext);

        Holder holder = null;


        if (convertView == null) {

            holder=new Holder();
            convertView = inflater.inflate(R.layout.design_forum, parent, false);
            holder.upVote = (ImageButton) convertView.findViewById(R.id.upVote);
            holder.downVote = (ImageButton) convertView.findViewById(R.id.downVote);
            holder.timeAsked = (TextView) convertView.findViewById(R.id.timeAsked);
            holder.asker = (TextView) convertView.findViewById(R.id.asker);
            holder.mainAnswer = (TextView) convertView.findViewById(R.id.mainAnswer);
            holder.mainQuestion = (TextView) convertView.findViewById(R.id.mainQuestion);
            holder.rating = (TextView) convertView.findViewById(R.id.rating);
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();

        }




        holder.upVote.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



                Log.v("adsl", "upvote");


            }
        });
        holder.downVote.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



            }
        });

        holder.mainQuestion.setText(mList.get(position).getMainQuestion());
        holder.mainAnswer.setText(mList.get(position).getMainAnswer());
        holder.asker.setText(mList.get(position).getAsker());
        holder.timeAsked.setText(mList.get(position).getTime());
        holder.rating.setText(mList.get(position).getRating() + "");


        return convertView;


    }

    class Holder {

        private ImageButton upVote, downVote;
        private TextView timeAsked, asker, mainQuestion, mainAnswer, rating;


    }


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


    @Override
    public Question getItem(int position) {
        return mList.get(position);
    }

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

    @Override
    public int getPosition(Object item) {
        return super.getPosition(item);
    }

更新:我保留了实际评级的一部分。我还保留了新的onclick听众。但兄弟们,请你简单说说你想说什么。 (我的问题模型有mainQuestion,mainAnswer,asker,time和rating)

第二次更新:我再次编辑了这个问题,并且这次使用了视图持有者。剩下的最后一件事是单个按钮点击一个invidual项目。我该怎么办?

2 个答案:

答案 0 :(得分:0)

你的逻辑搞砸了。您有适配器的1个虚拟评级,每个项目需要一个。您有一个适配器的全局onClickListener,每个项目需要一个。解决此问题的最简单方法是每次调用getView时为getView中的所有对象创建一个新的OnClickListener。然后你可以确保它指向正确的视图。您还需要为适配器中的每个项目保持单独的评级。要么需要将分数添加到Question对象,要么需要保留带有问题和分数的对象列表,而不仅仅是问题列表。

答案 1 :(得分:0)

非常简单,您只需点击按钮即可获得当前位置模型:

upVoteBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                //1) get the current click model from the list
                yourModel = yourList.get(position);//now yourmodel contains current clicked position data
                //now just set the upVode click true
                Toast.makeText(context, "up vote clicked", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.firebaseCrashReport(e);
            }
        }
    });

希望这会对你有所帮助