2013-10-14 83 views
0

這個android/java的東西還是比較新的。我現在使用擴展BaseAdapter來顯示數組的內容。當調用適配器時,我試圖發送一個布爾值與它。發送時,首先將變量設置爲我試圖設置的值,但是在輸入getView()函數時,該值已被重置爲false或0(取決於我是使用bool還是int)。任何人都知道是怎麼回事BaseAdapter更改變量值

我的代碼如下:?

MainActivity.java

public class MainActivity extends Activity { 

    boolean run = false; 
    public String msg; 
    boolean out; 

    private ArrayList<String> arrayList = new ArrayList<String>(); 
    ListView listView; 

    private RowAdapter radapter; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      radapter = new RowAdapter(getApplicationContext(), R.layout.row, out, arrayList); 
      listView = (ListView)findViewById(R.id.list); 
      listView.setAdapter(radapter); 

      new Thread(new ClientThread()).start(); 
     } 


     public void onClick(View view) { 
      try { 
       EditText et = (EditText) findViewById(R.id.EditText01); 
       String str = et.getText().toString(); 
       printWriter = new PrintWriter(new BufferedWriter(
        newOutputStreamWriter(socket.getOutputStream())), 
         true); 
       printWriter.println(str); 
       out = true; 
       AddChat(str); 
       radapter.notifyDataSetChanged(); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 


     class ClientThread implements Runnable { 
      @Override 
      public void run() { 
       run = true; 
       try{ 
        if(msg!=null){ 
         AddChat(msg); 
         out = false; 
        MainActivity.this.runOnUiThread(newRunnable(){ 
         @Override 
         public void run(){ 
                radapter.notifyDataSetChanged(); 
            } 
           }); 
          } 
         } 

        }catch(Exception e){ 
         e.printStackTrace(); 
        }   
       }catch(UnknownHostException e1){ 
        e1.printStackTrace(); 
       }catch(IOException e1){ 
        e1.printStackTrace(); 
       } 

      } 

     } 
     public void AddChat(String msg){ 
      arrayList.add(msg); 
     } 
} 

RowAdapter.java

public RowAdapter(Context context, int textViewResourceId, boolean out,ArrayList<String> arrayList) { 
    super(); 

    this.textViewResourceId = textViewResourceId; 
    this.arrayList = arrayList; 
    this.context = context; 
    this.out=out; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent){ 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater)  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(textViewResourceId, parent, false); 
    } 

    String s = arrayList.get(position); 

    if (out) { 
     if (s != null) { 
     TextView label = (TextView) convertView.findViewById(R.id.label); 
      TextView message = (TextView) convertView.findViewById(R.id.message); 
      if ((message!= null) &&(label!=null)) { 
       label.setText(""); 
       message.setText(s); 
      } 
      convertView.setBackgroundResource(R.drawable.yellow); 
      ((RelativeLayout) convertView).setGravity(Gravity.RIGHT); 

     } 
    } 

    if (!out) { 
     if (s != null) { 
     TextView label = (TextView)convertView.findViewById(R.id.label); 
      TextView message = (TextView)convertView.findViewById(R.id.message); 
      if ((message!= null) &&(label!=null)) { 
       label.setText(""); 
       message.setText(s); 
      } 
     } 

    } 
    long timestamp = System.currentTimeMillis(); 
    String readableTimestamp = (String)DateUtils.getRelativeTimeSpanString(timestamp); 
    TextView date = (TextView)convertView.findViewById(R.id.textTime); 
    date.setText(readableTimestamp); 

    return convertView; 
} 

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

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

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

回答

0

您是否期待MainActivity中的out以某種方式複製到RowAdapter

當此行被MainActivity執行:

radapter = new RowAdapter(getApplicationContext(), R.layout.row, out, arrayList); 

RowAdapterout將被設置爲任何值MainActivityout包含的時間。如果您在此沒有看到警告,我很驚訝,因爲out還沒有在那裏初始化。

如果你想在RowAdapterout成員從MainActivity在以後設置,您就需要實現一個二傳手,如:

在RowAdapter.java:

private boolean out; 

public void setOut(boolean value) { 
    this.out = value; 
} 

然後在MainActivty,改變out = trueradapter.setOut(true);

0

當調用我想t時的適配器o用它發送布爾值 的值。

我不明白你的意思。 「呼叫適配器」是什麼意思?

發送時,該變量被首先設置爲我試圖 組,該值而在進入getView()時 - 功能,該值一直 復位爲假或0(取決於我是否使用布爾或int。

getView()功能,你指的是?

如果你指的是什麼out值,那麼你應該知道,Java會透過參考對象(ArrayList是一個對象),但通過值傳遞基元(boolean是一個基元)。

當您在活動中更改arrayList變量時,它將在Adapter中更改,因爲它們都是對同一Object的引用。

當您在活動改變out變量,它只會在活動發生變化,因爲在您的適配器out變量是不以任何方式連接到它。

0

你的問題是out是一個原始類型,這意味着當你將它傳遞給一個對象時,你只傳遞一個值的副本而不是引用。一個解決方案可能是創建一個setOut()方法,以便在每次更改它時設置out的值。