2017-02-27 74 views
-1

我试图在自定义适配器中显示所有问题。我也设置了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,提问者,时间和评级)

第二次更新:我再次编辑了这个问题,并使用了查看持有人这次。剩下的最后一件事是单个项目的单个按钮点击。我该怎么做呢?

+2

的[自定义适配器列表视图(http://stackoverflow.com/questions/8166497/custom-adapter可能的复制-for-list-view) –

+0

你怎么能说它是重复的?我的问题是使用布局中的单个按钮单击 –

+0

尝试在getView()中将setTag(位置)添加到ImageButton中。在OnClickListener()内部,使用getTag()返回位置并更新mList中的相应项目,然后调用notifyDataSetChanged()。我有一个关于ListView的博客:http://programandroidlistview.blogspot.com/ 有关如何做的示例,希望它有帮助! –

回答

0

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

+0

兄弟我编辑的问题,请检查 –

+0

ImageButton upVote,downVote; TextView timeAsked,asker,mainQuestion,mainAnswer,rating; int currentRating; 所有这些需要是每个项目,而不是每个适配器。 Google ViewHolder模式寻求帮助。 –

+0

兄弟再次编辑的问题,你可以请进一步解释 –

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); 
      } 
     } 
    }); 

希望这将帮助你

+0

我的upvote是在自定义适配器..你可以请解释liitle位,然后如何访问列表 –

+0

当然,声明yourlist作为全局变量在适配器和点击按钮你使用列表.....或者你发给我的适配器生病了修复它,并给你生病@ sanatchandravanshi @ gmail.com –

相关问题