こんにちは、私はこの問題に何度も直面していますが、グーグルで正しい解決策を見つけられません。何が私のサーバーと同期するチャットアプリケーションを作成したい私は8秒ごとにサーバーからデータを取得し、リストビューで更新されたものを表示し、前のものをクリアする手法を実装しました。私が直面した問題は、私がリストビューをスクロールするとアプリケーションがクラッシュし、logcatに投稿したエラーが表示されるということです。リストビューをサーバー経由で更新し、更新したものを連結なしで表示する
Logcat:
java.lang.IndexOutOfBoundsException: Invalid index 13, size is 0
MainActivity.java
import java.util.ArrayList;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.RequiresApi;
import android.text.Html;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends ListActivity
{
Handler h;int delay;
private static final String REGISTER_URL = "http://friends.ueuo.com/chat.php";
public static final String RECEVIE_URL = "http://friends.ueuo.com/rec.php";
String message,Sender_name;
public static final String KEY_SEND = "send";
public static final String KEY_RECEIVE = "receive";
public static final String KEY_MESSAGE = "Message";
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list1 = new ArrayList<String>();
ArrayAdapter<String> adapter,adapter1;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Receive();
h = new Handler();
delay = 15000; //milliseconds
h.postDelayed(new Runnable()
{
public void run()
{
list.clear();
Receive();
h.postDelayed(this, delay);
}
}, delay);
Button btn = (Button) findViewById(R.id.addItem);
adapter = new ArrayAdapter<String>(this,R.layout.my_custom_layout, list);
OnClickListener listener = new OnClickListener()
{
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
EditText edit = (EditText) findViewById(R.id.text);
message = edit.getText().toString();
String sender = "Sender"+System.lineSeparator()+"";
list.add(sender+edit.getText().toString());
setListAdapter(adapter);
adapter.notifyDataSetChanged();
registerUser();
}
};
btn.setOnClickListener(listener);
}
private void registerUser()
{
StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, response, Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put(KEY_SEND, "[email protected]");
params.put(KEY_RECEIVE, "[email protected]");
params.put(KEY_MESSAGE, message);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
private void Receive()
{
StringRequest stringRequest = new StringRequest(RECEVIE_URL, new Response.Listener<String>()
{
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onResponse(String response)
{
showJSON(response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(MainActivity.this,error.getMessage().toString(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void showJSON(String response)
{
JSONObject jsonObject=null;
JSONArray users = null;
try
{
jsonObject = new JSONObject(response);
users = jsonObject.getJSONArray("result");
// JSONObject jsonObject = new JSONObject(response);
//JSONArray result = jsonObject.getJSONArray("result");
// JSONObject collegeData = result.getJSONObject(2);
// name = collegeData.getString("message");
for(int i=0;i<users.length();i++)
{
JSONObject jo = users.getJSONObject(i);
message=jo.getString("message");
Sender_name=jo.getString("sendby");
if (Sender_name.equals("[email protected]"))
{
String sender="Wajid Usman"+System.lineSeparator()+"";
list.add(sender+message);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
else
{
String receiver="Salman"+System.lineSeparator()+System.lineSeparator();
list.add(receiver+message);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
}
catch (JSONException e)
{
e.printStackTrace();
}
}
}
このコードはエラーとは関係がないと思います。しかし、答えでは空のリストから要素を取得しようとしているように –