2017-02-27 27 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 –

相關問題