4

This issue is on MarshMallow (only)

I am working on an chat application using textview in listview, when I touch/longpress on item of the textview, it gets focus and works fine in Android version 4.2.2 but in MarshMallow it loses focus same time. I have searched for two days and applied all the methods which were suggested.

I have found only one solution to use Recyclerview instead of ListView, but the requirement is to do with ListView.

Can anyone guide me how to do it with ListView.

Please do not downvote if you do not understand or any mistake from my side, comment it.

Here is my code:

row_chat.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_chat"
style="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Add message"
android:padding="@dimen/ten"
android:background="@android:color/white"
android:textIsSelectable="true"
android:textSize="@dimen/size_chat" />

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.ramesh.myapplication.MainActivity"
    tools:showIn="@layout/activity_main">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_above="@+id/ll"
        android:layout_weight="1"
        android:descendantFocusability="afterDescendants"
        android:dividerHeight="1dp"
        android:focusable="true"
        android:visibility="visible" />

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/et_post"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:maxLines="2" />

        <Button
            android:id="@+id/btn_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/add" />
    </LinearLayout>


</LinearLayout>

ChatAdapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.TextView;

import com.ramesh.myapplication.R;
import com.ramesh.myapplication.models.ModelChat;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Ramesh Kumar on 3/9/2016.
 */
public class ChatAdapter extends BaseAdapter {

    ArrayList<ModelChat> list;
    protected Context context;
    int resourceID;

    public ChatAdapter(Context context, int resID, ArrayList<ModelChat> list) {
        this.context = context;
        this.resourceID = resID;
        this.list = list;
    }

    @Override
    public int getCount() {
        if (list == null || list.size() <= 0)
            return 0;
        return list.size();
    }

    @Override
    public ModelChat getItem(int position) {
        return list.get(position);
    }

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


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

        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(resourceID, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.textView.setText(list.get(position).getmDescription());

        viewHolder.textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    final int position = v.getId();
                    final TextView Caption = (TextView) v;
                    Caption.requestFocus();
//                    myItems.get(position).caption = Caption.getText().toString();
                }
            }
        });


        viewHolder.textView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final TextView Caption = (TextView) v;
                Caption.requestFocus();
                return false;
            }
        });
        return convertView;
    }

    public void addModel(ModelChat modelChat) {
        list.add(modelChat);
        notifyDataSetChanged();
    }

    public void editModel(ModelChat modelChat, int position) {
        if (position < 0)
            return;
//        list.remove(position);
//        list.add(position, modelChat);
        list.get(position).setmDescription(modelChat.getmDescription());
        notifyDataSetChanged();
    }


    public class ViewHolder {
        public TextView textView;

        public ViewHolder(View convertView) {
            textView = (TextView) convertView.findViewById(R.id.tv_chat);

        }
}
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView listView;
    ChatAdapter adapterChat;
    EditText etDesc;
    Button btnAdd;

    ArrayList<ModelChat> listChat;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        initViews();
        applyFunctionalityListView();
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addButtonClickFunctionality(etDesc.getText().toString());
            }
        });
    }

    private void initViews() {
        listView = (ListView) findViewById(R.id.lv);
        etDesc = (EditText) findViewById(R.id.et_post);
        btnAdd = (Button) findViewById(R.id.btn_add);

    }

    private void applyFunctionalityListView() {
        listChat = new ArrayList<>();
        adapterChat = new ChatAdapter(this, R.layout.row_chat, listChat);
        listView.setAdapter(adapterChat);

    }

    private void addButtonClickFunctionality(String s) {
        if (s == null || s.replaceAll(" ", "").equals("")) {
            return;
        }

        ModelChat modelChat = new ModelChat();
        modelChat.setmDescription(s);
        ((ChatAdapter) listView.getAdapter()).addModel(modelChat);
        etDesc.setText("");


    }

}
Ramesh Kumar
  • 1,229
  • 14
  • 24

0 Answers0