Search code examples
androidlistviewandroid-custom-viewbaseadapter

Items disappear when fast scrolling ListView


I have created an adapter which extends the BaseAdapter. Following is the class:

class LocalAdapter extends BaseAdapter{

    private Context context;
    public LocalAdapter(Context ctx){
        context=ctx;
    }

    @Override
    public int getCount() {
        return messages.size();
    }

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

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        if(view==null){
            LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = li.inflate(R.layout.chat_list_item,viewGroup,false);
        }


        TextView rightView = (TextView)view.findViewById(R.id.rightAligned);
        TextView leftView = (TextView)view.findViewById(R.id.leftAligned);



        if(messages.get(i).getFrom().equals(UserInfo.getMobileNumber())){
            rightView.setText(messages.get(i).getMessage());
            leftView.setVisibility(View.GONE);
        }
        else{
            leftView.setText(messages.get(i).getMessage());
            rightView.setVisibility(View.GONE);
        }

        return view;
    }
}

The adapter can access the ArrayList from the main class. It has around 30 items. Now when I load the List all the items are loaded, but when scrolling through the list, some items get on disappearing on scroll.

Please provide solution for it.


Solution

  • You are probably not calling setVisiblity(View.VISIBLE) only hiding view, fix it this way:

    if (messages.get(i).getFrom().equals(UserInfo.getMobileNumber())){
        rightView.setText(messages.get(i).getMessage());
        leftView.setVisibility(View.GONE);
        rightView.setVisibility(View.VISIBLE);
    } else {
        leftView.setText(messages.get(i).getMessage());
        rightView.setVisibility(View.GONE);
        leftView.setVisibility(View.VISIBLE);
    }