BaseAdapter更改变量值

时间:2013-10-14 13:46:33

标签: java android android-listview baseadapter

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

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

3 个答案:

答案 0 :(得分:0)

您是否期望out中的MainActivity以某种方式复制到RowAdapter

MainActivity执行此行时:

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

RowAdapter的{​​{1}}将被设置为out MainActivity当前包含的值out。如果您在此处未看到警告,我会感到惊讶,因为out尚未在那里初始化。

如果您希望稍后从out RowAdapter设置MainActivity成员,则需要实施设置工具,例如:

在RowAdapter.java中:

private boolean out;

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

然后在MainActivty中,将out = true更改为radapter.setOut( true );等。

答案 1 :(得分:0)

  

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

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

  

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

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

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

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

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

答案 2 :(得分:0)

您的问题是out是基本类型,这意味着当您将其传递给对象时,您只传递值的副本而不传递引用。解决方案可能是创建setOut()方法,以便在每次更改时设置out的值。