2015-06-18 2 views
3

Я изучаю, как извлекать данные, хранящиеся в Parse. Я могу извлекать данные из синтаксического анализа и связывать их с простым ListView. Теперь я пытаюсь издеваться над простым чат-приложением. У меня есть два столбца в классе parse для хранения имени отправителя и сообщения чата. Я сделал пользовательские ListView, чтобы показать имя отправителя и сообщение, как показано нижеAndroid - Сохранение объектов в список объектов

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/UserNameTxt" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5sp" 
    android:textColor="@color/material_blue_grey_900" 
    android:textSize="15sp" /> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/UserMessageTxt" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5sp" 
    android:textColor="@color/material_blue_grey_900" 
    android:textSize="25sp" /> 
</LinearLayout> 

и класса адаптера для привязки данных

public class ChatAdapter extends ArrayAdapter<Chat> { 
Context context; 
int layoutResourceId; 
Chat data[] = null; 
public ChatAdapter(Context context, int resource, Chat[] objects) { 
    super(context, resource, objects); 
    this.layoutResourceId=resource; 
    this.context=context; 
    this.data=objects; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row=convertView; 
    ChatHolder holder=null; 
    if(row==null) 
    { 
     LayoutInflater inflater=((Activity)context).getLayoutInflater(); 
     row=inflater.inflate(layoutResourceId,parent,false); 
     holder= new ChatHolder(); 
     holder.UserName=(TextView)row.findViewById(R.id.UserNameTxt); 
     holder.UserMessage=(TextView)row.findViewById(R.id.UserMessageTxt); 
     row.setTag(holder); 
    } 
    else 
    { 
     holder=(ChatHolder)row.getTag(); 
    } 
    Chat chat=data[position]; 
    holder.UserName.setText(Chat.UserName); 
    holder.UserMessage.setText(Chat.UserMessage); 
    return row; 
} 
static class ChatHolder 
{ 
    TextView UserName; 
    TextView UserMessage; 
} 
} 

и класса чата является

public class Chat { 
public static String UserName; 
public static String UserMessage; 
public Chat() 
{ 
    super(); 
} 
public Chat(String _UserName,String _UserMessage) 
{ 
    super(); 
    UserName=_UserName; 
    UserMessage=_UserMessage; 
} 
public String getName() 
{ 
    return UserName; 
} 
} 

Код для основной деятельности (я только что включил важные детали)

List<Chat> chatData=new ArrayList<Chat>(); 

@Override 
protected Void doInBackground(Void... params) { 
     ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
       "Chat"); 
     try { 
      ob = query.find(); 
     } catch (ParseException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

@Override 
protected void onPostExecute(Void result) { 
     Chat c; 
     listview = (ListView) findViewById(R.id.listView); 
     for (ParseObject country : ob) { 
      chatData.add(new Chat((String) country.get("Sender"),(String) country.get("ChatMessage"))); 
     } 
     String name01=chatData.get(0).getName(); //for debugging 
     String name02=chatData.get(1).getName(); //for debugging 
     String name03=chatData.get(2).getName(); //for debugging 

     Chat chatArray[]=chatData.toArray(new Chat[chatData.size()]); 

     String name=chatArray[0].getName(); //for debugging 
     String name1=chatArray[1].getName(); //for debugging 
     String name2=chatArray[2].getName(); //for debugging 

     ChatAdapter cAdapter=new ChatAdapter(MainActivity.this,R.layout.listview_item,chatArray); 

     listview.setAdapter(cAdapter); 
     mProgressDialog.dismiss(); 
    } 

Снимок экрана с выходом http://i.stack.imgur.com/bxnto.png

У меня есть три строки данных в моем классе Parse. В качестве вывода я получаю последнюю вставленную строку всего три раза. Вот скриншот отладки Windows http://i.stack.imgur.com/l7CAs.png

Внутри цикла Я получаю правильные значения из синтаксического анализа, но после добавления его в список chatData происходит что-то неправильное.

Это мой первый вопрос здесь. Мне очень жаль большую должность, и если я не понимаю этого вопроса. Спасибо

+0

Никто не будет читать через весь этот код. Постарайтесь создать как можно более короткий случай, который не работает должным образом. Скорее всего, вы сами найдете свою ошибку. – Ridcully

+0

Жаль, что я не согласен. OP сделала отличную работу по предоставлению необходимых деталей. Если вы следуете большинству вопросов, первый комментарий обычно заключается в том, чтобы попросить OP разместить файл макета, код и т. Д. На самом деле, я действительно впечатлен OP, фактически вставляющим только соответствующий код и помещающий снимки экрана обоих выходных данных образ и отладочное изображение. – Raghu

+0

Поскольку вы не инициализируете массив chartdata и не добавляете, может быть, у вас есть более 3 элементов, и первые 3 элемента имеют некорректные данные? Когда вы отлаживаете, можете ли вы проверить, что содержит диаграммы после добавления элементов из запроса Parse? – Raghu

ответ

1

Мне кажется, что статическийUserName и UserMessage в классе Chat является причиной вашей проблемы. Изменение их

public String UserName; //from public static String UserName; 
public String UserMessage; //from public static String UserMessage; 

, а также изменить эту часть адаптера:

holder.UserName.setText(chat.UserName);  // from Chat.UserName 
holder.UserMessage.setText(chat.UserMessage); // from Chat.UserMessage 
+0

Это работало как шарм. Спасибо! – abhi8569

Смежные вопросы