2013-01-05 101 views
0

在我的應用程序中,我使用了一個顯示來自CustomAdapter.In數據的列表視圖。我的arraylist中有兩個項目。我的列表視圖顯示最後一次添加的數據而不是第一個項目。 這是我的自定義適配器:ListView錯誤地顯示項目

public class NodeListViewCustomAdapter extends BaseAdapter { 
    LayoutInflater inflater; 
    Activity mActivity; 
    ArrayList<Node> mNodeList; 
    double mRecvProgress; 
    double mSentProgress; 
    String repeatSentprogress; 
    String repeatRecvprogress; 
    ViewHolder holder; 
    Node node; 
    public NodeListViewCustomAdapter(Activity aContext,Node node,ArrayList<Node> nodeList){ 
     super(); 
     mActivity = aContext; 
     this.node = node; 
     this.inflater = (LayoutInflater)aContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.mNodeList = nodeList; 
    } 
    @Override 
    public int getCount() { 
     return mNodeList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
    @Override 
    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
    } 

    public static class ViewHolder 
    { 
     TextView txtViewnodeTitle; 
     TextView sentStatustxtView; 
     TextView recvStatustxtView; 
     TextView msgsentvalue; 
     TextView msgrecvvalue; 
     TextView sentindicator; 
     TextView recvindicator; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView==null) 
     { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.nodelistitem_row, null); 
     } else{ 
      holder=(ViewHolder)convertView.getTag(); 
     } 
      if(node.advertise) 
       convertView.setBackgroundColor(Color.YELLOW); 
      node.advertise = false; 
      convertView.setBackgroundColor(Color.BLACK); 
      holder.txtViewnodeTitle = (TextView) convertView.findViewById(R.id.txtViewnodeTitle); 
      holder.sentStatustxtView = (TextView) convertView.findViewById(R.id.sentstatustxtView); 
      holder.recvStatustxtView = (TextView) convertView.findViewById(R.id.recvstatustextView); 
      holder.msgsentvalue = (TextView) convertView.findViewById(R.id.msgsenttitle); 
      holder.msgrecvvalue = (TextView) convertView.findViewById(R.id.msgrecvtitle); 
      convertView.setTag(holder); 

     holder.sentStatustxtView.setGravity(Gravity.LEFT); 
     holder.recvStatustxtView.setGravity(Gravity.LEFT); 

     computeProgress(); 
     holder.txtViewnodeTitle.setText(String.valueOf(node.nodeID)); 
     holder.msgsentvalue.setText("< "+String.valueOf(node.ms)+"/"+node.MS); 
     holder.sentStatustxtView.setText(repeatSentprogress); 
     holder.msgrecvvalue.setText("> "+String.valueOf(node.mr)+"/"+node.MR); 
     holder.recvStatustxtView.setText(repeatRecvprogress); 
     return convertView; 
    } 
    private void computeProgress() { 
     mSentProgress = ((double)node.ms/(double)node.MS)*20; 
     mRecvProgress = ((double)node.mr/(double)node.MR)*20; 
     repeatSentprogress = new String(new char[(int)mSentProgress]).replace('\0', (char) 9608); 
     repeatRecvprogress = new String(new char[(int)mRecvProgress]).replace('\0', (char) 9608); 
     if(node.ms == node.MS)holder.sentStatustxtView.setTextColor(Color.GREEN); 
     else holder.sentStatustxtView.setTextColor(Color.BLUE); 
     if(node.mr == node.MR)holder.recvStatustxtView.setTextColor(Color.GREEN); 
     else holder.recvStatustxtView.setTextColor(Color.BLUE); 
    } 

} 

這是我的活動:

public class Nodes extends Activity implements OnItemClickListener { 
    ListView mListView; 
    NodeListViewCustomAdapter mNodeListAdapter; 
    public ArrayList <Node> mNodesList ; 
    TextView nodeIdView; 
    Timer mTimer; 
    Timer mInnerTimer; 
    int delay = 500; 
    int period = 500; 
    boolean found = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nodes); 
     mListView = (ListView)findViewById(R.id.node_list); 
     mNodesList = new ArrayList<Node>(); 
     doTimerTask(); 
     mListView.setOnItemClickListener(this); 
    } 
    private void doTimerTask() { 
     mTimer = new Timer(); 
     mTimer.scheduleAtFixedRate(new TimerTask() { 

      @Override 
      public void run() { 

       runOnUiThread(new Runnable() { 
        public void run() { 
         while(true){ 
          try{ 
           String PeardOutput = null; 
           synchronized(AndroidPeardServer.nodestatsqe){ 
            PeardOutput = AndroidPeardServer.nodestatsqe.poll(); 
            if (PeardOutput == null) return; 
           } 
           String msg = PeardOutput.substring(3); 
           process_nodeStats(msg); 
           mNodeListAdapter.notifyDataSetChanged(); 
          } 
          catch(Exception e){ 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 
      } 
     }, delay, period); 

    } 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    } 
    private void process_nodeStats(String msg) { 
     String[] nodeStats = msg.split(":"); 
     String type = nodeStats[0]; 
     int  nodeID = Integer.parseInt(nodeStats[1]); 
     int  value = Integer.parseInt(nodeStats[2]); 
     int  cycle = Integer.parseInt(nodeStats[3]); 

     // Iterate through the nodelist 
     found = false; 
     for(Node node: mNodesList){ 
      if (node.nodeID != nodeID) { 
       continue; 
      } 
      else found = true; 
      populateNode(node,type, nodeID, value, cycle); 
      mNodeListAdapter = new NodeListViewCustomAdapter(getParent(),node,mNodesList); 
      mListView.setAdapter(mNodeListAdapter); 
      break; 
     } 
     if (!found){ 
      Node node = new Node();   
      mNodesList.add(node); 
      populateNode(node,type,nodeID,value,cycle); 
      mNodeListAdapter = new NodeListViewCustomAdapter(getParent(),node,mNodesList); 
      mListView.setAdapter(mNodeListAdapter); 
     } 
    } 
    private void populateNode(Node node,String type,int nodeId, int value, int cycle) { 

     node.nodeID = nodeId; 
     if(type.equals("MS")){ 
      node.MS = value; 
      node.CS = cycle; 
      node.ms = 0; 
     }else if(type.equals("MR")){ 
      node.MR = value; 
      node.CR = cycle; 
      node.mr = 0; 
     }else if(type.equals("ms")){ 
      if(cycle==node.CS) node.ms = + value; 
      else node.ms = value; 
     }else if(type.equals("mr")){ 
      if(cycle==node.CR) node.mr = + value; 
      else node.mr = value; 
     }else if (type.equals("NL")){ 
      mNodesList.remove(node); 
     }else if(type.equals("NA")){ 
      node.advertise = true; 
     } 
    } 


    //========= Node class to store in NodeList ================= 
    public class Node { 
     int nodeID; 
     int MS; //Total Messages to Send to nodeID 
     int ms; //number of Messages sent so far 
     int MR ; //Total Messages expected from nodeID 
     int mr; //number of Messages received so far 
     int CS; //Investigation Cycle for Sending 
     int CR; //Investigation Cycle for Receiving 
     boolean advertise = false; // To know the advertisements received 
    } 
} 
+0

我有上帝的感覺,你忘了在'if(node.advertise)'周圍粘貼一些括號,例如/ –

+0

我故意這樣做,因爲如果單條語句的條件只有 – AndroidCrazy

+0

醜。此外,縮進建議不同。對我來說,至少不要跨越下一個陳述更合乎邏輯。總是爲ifs放置花括號! –

回答

0

我終於針鋒相對right.I沒有采取從arraylist.So這行做了我的節點。

node = mNodeList.get(position); 

謝謝大家。