2017-02-15 2 views
-1

Я пытаюсь создать страницу чата (Message view).Реализация Android ListView с несколькими строками Row

Имеются изображения и текстовые сообщения. И я использую Firebase для этого.

Итак, я попробовал собственный код. И он также показывает изображения. Я имею в виду, что работает разный макет. Но проблема в том, что после закрытия приложения, а затем, когда я снова открываю. Я вижу ссылки в строке вместо изображения.

Вот мой ArrayAdapter.

public class ChatAdapter extends BaseAdapter { 
ArrayList<String> message = new ArrayList<>(); 
ArrayList<Integer> image = new ArrayList<>(); 

Context c; 
String username; 
String otherusername; 

ArrayList<Integer> type = new ArrayList<>(); 

public ChatAdapter(ArrayList<String> message, ArrayList<Integer> image, Context c, String username, String otherusername, ArrayList<Integer> type) { 
    this.message = message; 
    this.image = image; 
    this.c = c; 
    this.username = username; 
    this.otherusername = otherusername; 
    this.type = type; 
} 


@Override 
public int getCount() { 

    return message.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public static class ViewHolder { 
    ImageView imageView; 
    TextView messageView; 
    CircleImageView profileImage; 
} 

@Override 
public int getViewTypeCount() { 
    return 4; 
} 

@Override 
public int getItemViewType(int position) { 
    return type.get (position); 
} 

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) 

@Override 

public View getView(int position, View convertView, ViewGroup parent) { 

    View v = convertView; 
    int messageType = getItemViewType (position); 

    ViewHolder holder; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (messageType==1){ 
      v = View.inflate (c,R.layout.chatroom_image,null); 



     } 
     else { 
      v = View.inflate (c, R.layout.message_item, null); 



     } 




    } 
    if (messageType==1){ 
     holder = new ViewHolder(); 
     holder.imageView = (ImageView) v.findViewById (R.id.imageMessage); 
     holder.profileImage = (CircleImageView) v.findViewById (R.id.profile_image); 
     Picasso.with(c).load(image.get (position)).into(holder.imageView); 


    } 
    else { 
     holder = new ViewHolder(); 
     holder.messageView = (TextView) v.findViewById (R.id.message_view); 
     holder.profileImage = (CircleImageView) v.findViewById (R.id.profile_image); 

     holder.messageView.setText (message.get (position)); 
     holder.profileImage.setImageResource (image.get (position)); 





    } 

    return v; 
} 
} 

В Firebase структуры данных как следующий ..

Firebase Datastructure

 messageList.setAdapter (new ChatAdapter (message_list, profile_img_list, getApplicationContext(), Fusername, chat_username,types)); 

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

Спасибо за помощь.

+1

Пожалуйста не перепечатывать вопросы, которые вы уже alread задавали вопрос о «ListView с многократной Layout Ей» ... редактировать: очевидно, что вы должны сделать некоторые исследования, как я не вижу '' getViewTypeCount', ни реализации getItemViewType' – Selvin

+0

Да, я спросил. И попытался это сделать. Но у меня возникают некоторые проблемы с этим @Selvin – Doge

+0

А я этого не хватает. Thanx @Selvin – Doge

ответ

2

Я предлагаю вам использовать RecyclerView вместо старого ListView. ListView действительно устарел.

Пример того, как использовать различные ItemViews в RecyclerView дается здесь: https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

+0

Спасибо, я попробую. – Doge

+1

Np, если вам нужна помощь, не стесняйтесь спрашивать. – CrowsNet

0

С текущей реализацией, вы не заполните элементы с данными, если вид преобразования не является нулевым. Это будет означать, что в представлении списка будут отображаться элементы со старыми данными.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     // inflate view 

     // populate view 
    } 
} 

Попробуйте переместить код, чтобы заполнить держатель вида за пределами нулевой отметки.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     // inflate view 
    } 

    // always populate view 
} 
Смежные вопросы