Android GridView点击事件无响应,无法点击

发生环境:

1.GridView的xml布局

<GridView
    android:id="@+id/nsdk_layout_rg_ugc_event_page_grid_info"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/d2uc_dimen_32"
    android:layout_marginBottom="@dimen/lion_ugc_content_center_item_margin_bottom"
    android:layout_marginEnd="@dimen/d2uc_dimen_32"
    android:listSelector="@android:color/transparent"
    android:descendantFocusability="afterDescendants"
    android:horizontalSpacing="@dimen/d2uc_dimen_8">

2.item的布局

<?xml version="1.0" encoding="utf-8"?>
<TextView   android:fontFamily="@font/gms_ui_thin" xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:minWidth="@dimen/navi_rg_ugc_report_listview_text_width_new"
          android:layout_height="@dimen/navi_rg_ugc_event_hint_item_height"
          android:textSize="@dimen/lion_common_text_size_13_dp"
          android:background="@drawable/selector_button_focus"
          android:focusable="true"
          android:textColor="@color/text_primary_nor"
          android:layout_marginRight="@dimen/navi_rg_ugc_report_panel_gridview_spacing_margin_right_new"
          android:gravity="center">

</TextView>

java代码:

detailGridView.setOnItemClickListener(
        new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ugcCommonTextAdapter.setSelectedPos(position);
                ugcCommonTextAdapter.notifyDataSetChanged();
            }
    });

原因:

1.GridView布局中添加了属性android:descendantFocusability="afterDescendants" 

2.自布局中添加了 android:focusable="true" 属性,导致子view可以获取焦点

由于afterDescendants属性,所以子view获取焦点的同时便拦截了ItemClick事件

其他说明:

descendantFocusability属性:

descendantFocusability是View的一个属性。可以理解是viewGroup和其子控件焦点相关的属性。

通过这个属性可以指定viewGroup和其子View到底谁获取焦点, 直接在viewGroup上使用就行。

下面是这个属性的三种属性值:

beforeDescendants :viewGroup会优先其子类控件而获取到焦点

afterDescendants :viewGroup只有当其子类控件不需要获取焦点时才获取焦点

blocksDescendants :viewGroup会覆盖子类控件而直接获得焦点

解决方法有三种:

第一种:自定义view的点击事件利用接口实现ItemClick事件监听

adapter中代码添加接口

private UgcCommonTextAdapterCallBack callBack;

public interface UgcCommonTextAdapterCallBack {
    void onClick(View view ,int position);
}

public void setCallBack(UgcCommonTextAdapterCallBack callBack) {
    this.callBack = callBack;
}

并在adapter的getView方法中添加view的onclick事件利用接口传递出去,实现自定义ItemClick事件

public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (callBack != null) {
                callBack.onClick(view, position);
            }
        }
    });
    return view;
}

最后adapter的引用现实该接口,自定义的itemClick事件就完成了 

ugcCommonTextAdapter.setCallBack(new UgcCommonTextAdapter.UgcCommonTextAdapterCallBack() {
    @Override
    public void onClick(View view, int position) {
        ugcCommonTextAdapter.setSelectedPos(position);
        ugcCommonTextAdapter.notifyDataSetChanged();
    }
});

第二种:去掉 android:descendantFocusability="afterDescendants"  属性

第三种:去掉子VIew中的android:focusable="true" 属性,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GridViewAndroid的一个前端控件,它主要用于在应用程序中显示类似网格视图的数据。因此,GridView本身并没有后端代码。 但是,如果您想要从服务器上获取数据并在GridView中显示它,则需要编写一些后端代码。以下是一个简单的后端代码示例,它使用PHP和MySQL来获取数据并将其返回给Android客户端: ```php <?php //连接MySQL数据库 $host = "localhost"; $user = "root"; $password = ""; $dbname = "mydatabase"; $con = mysqli_connect($host, $user, $password, $dbname); //检查连接是否成功 if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } //从数据库中获取数据 $result = mysqli_query($con, "SELECT * FROM mytable"); //将数据转换为JSON格式 $rows = array(); while ($r = mysqli_fetch_assoc($result)) { $rows[] = $r; } echo json_encode($rows); //关闭数据库连接 mysqli_close($con); ?> ``` 上面的代码连接到MySQL数据库并从一个名为"mytable"的表中获取数据。然后,它将结果转换为JSON格式并将其返回给客户端。 在Android客户端中,您可以使用HTTP请求来调用上述PHP代码并获取数据。以下是一个简单的示例,它使用Volley库来发送HTTP请求并解析JSON响应: ```java public class MainActivity extends AppCompatActivity { private GridView mGridView; private ImageAdapter mImageAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGridView = findViewById(R.id.grid_view); mImageAdapter = new ImageAdapter(this); mGridView.setAdapter(mImageAdapter); //使用Volley库发送HTTP请求 RequestQueue queue = Volley.newRequestQueue(this); String url = "http://yourdomain.com/getdata.php"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { //解析JSON响应并更新GridView适配器 JSONArray jsonArray = response.getJSONArray("data"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); int imageId = jsonObject.getInt("imageId"); mImageAdapter.addImage(imageId); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); queue.add(jsonObjectRequest); } } ``` 上述代码发送一个GET请求到"http://yourdomain.com/getdata.php",并解析JSON响应以获取图像ID。然后,它将图像ID添加到GridView适配器中,并在界面上显示图像。 请注意,上述代码仅用于示例目的。在实际开发中,您需要更加复杂的后端代码来获取和处理数据,以及更加健壮的Android客户端代码来处理网络请求和异常情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值