Я хотел бы заполнить свой Listview с помощью цикла, я недавно попытался заполнить его очень неэффективно, сделав несколько вызовов для данных из SQL. Когда я понял, насколько это неэффективно, я начал извлекать данные с сервера за один раз, используя массивы. У меня возникли проблемы с изменением кода для этого.Заполнение ListView из массива
Что мне нужно сделать, это найти способ прокрутки ниже массива JSONArrays (для меня это не сложная часть), но для этого мне нужно, чтобы моя GetSocietyDataASyncTask возвращала вышеупомянутый массив и находила способ о передаче его методу OnCreate/done в SocietySearch.java (многие объекты Общества в моем коде могут быть проигнорированы и каким-то образом заменены сообществами List)
Теперь я считаю, что я включил весь соответствующий код, но если вам нужно увидеть что-нибудь еще, пожалуйста, не стесняйтесь спрашивать меня.
Данные, полученные с помощью Java из моей базы данных выглядит следующим образом:
[{"society_id":1,"name":"TestName1","email":"[email protected]","description":"TestDes1"},
{"society_id":2,"name":"TestName2","email":"[email protected]","description":"TestDes2"}]
SocietySearch Класс:
public class SocietySearch extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_society_search);
Society society = new Society(-1, null, null, null);
ServerRequests serverRequest1 = new ServerRequests(SocietySearch.this);
serverRequest1.GetSocietyDataAsyncTask(society, new GetSocietyCallback() {
@Override
public void done(final Society returnedSociety) {
ListView lv = (ListView) findViewById(R.id.ListView);
List<ListViewItem> items = new ArrayList<>();
items.add(new ListViewItem() {{
ThumbnailResource = R.drawable.test;
Title = returnedSociety.socName;
Subtitle = returnedSociety.socDes;
}});
CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items);
lv.setAdapter(adapter);
}
});
}
class ListViewItem {
public int ThumbnailResource;
public String Title;
public String Subtitle;
}
соответствующая часть ServerRequests Класс:
public class getSocietyDataAsyncTask extends AsyncTask<Void, Void, Society> {
Society society;
GetSocietyCallback societyCallback;
public getSocietyDataAsyncTask(Society society, GetSocietyCallback societyCallback) {
this.society = society;
this.societyCallback = societyCallback;
}
@Override
protected Society doInBackground(Void... params) {
BufferedReader reader = null;
Society returnedSociety = null;
List<Society> societies = new ArrayList<>();
try {
URL url = new URL(SERVER_ADDRESS + "/getsocietydata.php");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(CONNECTION_TIMEOUT);
con.setReadTimeout(CONNECTION_TIMEOUT);
con.setRequestMethod("POST");
con.setDoOutput(true);
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while ((line = reader.readLine()) != null) { //Read until there is something available
sb.append(line + "\n"); //Read and save line by line
}
line = sb.toString(); //Saving complete data received in string
//Check values received in Logcat
Log.i("custom_check", "The values received in the store part are as follows:");
Log.i("custom_check", line);
JSONArray ja = new JSONArray(line);
if (ja != null && ja.length() == 0) {
returnedSociety = null;
} else {
for (int i = 0; i <ja.length(); i++) {
JSONObject json = ja.optJSONObject(i);
//Storing each Json in a variable
int society_id = json.getInt("society_id");
String socName = json.getString("name");
String socEmail = json.getString("email");
String socDes = json.getString("description");
returnedSociety = new Society(society_id, socName, socEmail, socDes);
societies.add(returnedSociety);
}
return returnedSociety;
}
} catch (Exception e) {
e.printStackTrace();
Log.d("Sample", "Error has occurred!\n" + e.toString());
}
finally {
if (reader != null) {
try {
reader.close(); //Closing the
} catch (IOException e) {
e.printStackTrace();
}
}
}
return returnedSociety;
}
@Override
protected void onPostExecute(Society returnedSociety) {
super.onPostExecute(returnedSociety);
progressDialog.dismiss();
societyCallback.done(returnedSociety);
}
}
CustomListViewAdapter.java:
public class CustomListViewAdapter extends BaseAdapter {
LayoutInflater inflater;
List<SocietySearch.ListViewItem> items;
public CustomListViewAdapter(Activity context, List<SocietySearch.ListViewItem> items) {
super();
this.items = items;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
//Auto-generated method stub
return items.size(); // TODO Maybe this can be my sql count?
}
@Override
public Object getItem(int position) {
//Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
//Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//Auto-generated method stub
ListViewItem item = items.get(position);
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.item_row, null);
ImageView test = (ImageView) vi.findViewById(R.id.imgThumbnail);
TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle);
TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle);
test.setImageResource(item.ThumbnailResource);
txtTitle.setText(item.Title);
txtSubTitle.setText(item.Subtitle);
return vi;
}
}
ListView Layour файл (item_row.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dip">
<ImageView
android:id="@+id/imgThumbnail"
android:layout_width="78dip"
android:layout_height="78dip"
android:layout_alignParentLeft="true"
android:layout_centerInParent="true"
android:layout_marginLeft="-3dip"
android:scaleType="centerInside"></ImageView>
<TextView
android:id="@+id/txtTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dip"
android:layout_marginTop="6dip"
android:layout_toRightOf="@+id/imgThumbnail"
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceLarge"></TextView>
<TextView
android:id="@+id/txtSubTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtTitle"
android:layout_marginLeft="6dip"
android:layout_marginTop="3dip"
android:layout_toRightOf="@+id/imgThumbnail"
android:text="TextView"></TextView>
</RelativeLayout>
Все выглядит прекрасно, так что в чем проблема? –
Ну с помощью этого кода я могу заполнить одну запись в списке, но не более того. Он работает только для последней записи. – kmil