我的项目需要在AlertDialog中显示一组书目,需要在AlertDialog中嵌套Listview显示Textview,可是发现一个问题,点击Textview中书名条目的空白区域无响应。只有点击书名文字才可以,初步怀疑是焦点问题,根据网上的资料都做过,问题依旧。最后发现一个奇怪的问题,Textview书名条目较少,即一个屏幕能全部展示,不需要Listview滚动的情况下,都正常,如果超过数量,上滑进入屏幕的条目是正常的,上滑划出屏幕再下滑进来的又正常了。由于我设置的文本居中,所以一眼就能看出来。我怀疑是在convertView这里出的问题。无论怎么改都不行。
但我使用Activity直接显示Listview,ListView项目中的Textview点击空白区域就没问题,
目前无奈的解决办法是不做居中,就左对齐,书名后面加好多空格加大宽度填满lisitview的item,但这样总觉得不好。
上代码各位看看。代码简单,就一个MainActivity 和xml
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> booklist=new ArrayList<>();
for(int i=0;i<20;i++) booklist.add("mybook__"+i);
ListView listview=new ListView(this);
listview.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return booklist.size();
}
@Override
public String getItem(int position) {
return booklist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
TextView textView=new TextView(MainActivity.this);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
textView.setLayoutParams(params);
textView.setTextSize(20);
textView.setPadding(30, 30, 30, 30);
convertView = textView;
}
TextView tview = ((TextView) convertView);
tview.setText(getItem(position));
return convertView;
}
//上面是动态生成Textview,下面注释掉的这个getView使用布局文件,都是同样的问题。
/* public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
convertView= LayoutInflater.from(MainActivity.this).inflate(R.layout.item_name,parent,false);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(booklist.get(position));
return convertView;
}
class ViewHolder {
TextView text;
}*/
});
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(listview);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
}
});
AlertDialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
}
布局文件item_name.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal">
<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="60dp"
android:focusable="false"
android:textSize="30sp"
android:textColor="@color/black"
android:gravity="center_vertical|center_horizontal"/>
</LinearLayout>
根据网上有人说的,根布局加android:descendantFocusability="blocksDescendants"
所有子布局加android:focusable="false",或者动态setFocusable(false)添加都不行。
截图:
一个屏幕能全部显示时显示正常
我跑了你提供的代码,new TextView 和 加载layout两种方式都是正常的,item正常点击有响应。你可以定位下是不是单机问题,或者是你建立一个新的工程跑下上述代码。