这个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;
}
答案 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
的值。