This issue only applies to MarshMallow (only)
I am working on a chat application using textview in listview, when I touch / long press on a textview element, it gets focus and works fine in Android version 4.2.2, but in MarshMallow it loses focus at the same time. I searched for two days and applied all the methods that were suggested.
I found only one solution for using Recyclerview instead of ListView, but this requirement is related to ListView.
Can anyone guide me how to do this with ListView.
Please do not reduce, if you do not understand or are not mistaken on your part, comment on this.
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;
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();
}
}
});
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.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("");
}
}