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("");
}
}