0

这个 android/java 的东西还是比较新的。我现在使用扩展BaseAdapter来显示数组的内容。调用适配器时,我试图用它发送布尔值。发送时,首先将变量设置为我尝试设置的值,但是当进入 getView() 函数时,该值已重置为 false 或 0(取决于我使用的是 bool 还是 int。是否有谁知道发生了什么?

我的代码如下:

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

行适配器.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;
}   
4

3 回答 3

0

你的问题是这out是一个原始类型,这意味着当你将它传递给一个对象时,你只传递了值的副本,而不是引用。一种解决方案可能是创建一种setOut()方法来在out每次更改时设置 ' 值。

于 2013-10-14T15:41:07.597 回答
0

您是否期望outinMainActivity以某种方式复制到RowAdapter

当此行执行时MainActivity

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

' RowAdapters将out被设置为当时包含的任何值。如果您在这里没有看到警告,我会感到惊讶,因为那里甚至还没有被初始化。MainActivityoutout

如果您想稍后在from中设置out成员,则需要实现一个 setter,例如:RowAdapterMainActivity

在 RowAdapter.java 中:

private boolean out;

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

然后在MainActivty,更改out = trueradapter.setOut( true );等。

于 2013-10-14T14:01:38.947 回答
0

调用适配器时,我试图用它发送布尔值。

我不明白你这是什么意思。“调用适配器”是什么意思。

发送时,首先将变量设置为我要设置的值,但是当进入 getView() 函数时,该值已重置为 false 或 0(取决于我使用的是 bool 还是 int。

getView()函数中,您指的是什么值?

如果您正在引用,out那么您应该知道Java通过引用传递对象(ArrayList是一个对象)但通过值传递基元(boolean是一个基元)。

当您更改 Activity 中的 arrayList 变量时,它会更改,Adapter因为它们都是对相同的引用Object

当您更改outActivity 中的变量时,它只会在 Activity 中更改,因为out适配器中的变量没有以任何方式连接到它。

于 2013-10-14T14:10:22.380 回答