焦点在RecyclerView android电视上不起作用

问题描述 投票:0回答:1

我正在创建一个android电视应用,因为我不必显示任何视频,所以我以常规方式创建它,就像为手机创建应用一样。

在模拟器上创建并测试之后,我决定将OnClick侦听器更改为OnFocusListener,但是没有任何效果,使用Onclicklistner可以正常工作

以下是我的主要活动Recyclerview的代码

public class MainActivity extends Activity {
    TextView tvCurrentTime,tvCurrentDate;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<ModelHomeSelector> homeSelectorList = new ArrayList();



        ModelHomeSelector object1 = new ModelHomeSelector();
        object1.setSelectorTitle("Guest Directory");
        object1.setSelectorImg(R.drawable.guestdirector);
        homeSelectorList.add(object1);

        ModelHomeSelector object2 = new ModelHomeSelector();
        object2.setSelectorTitle("Restaurant & Bar");
        object2.setSelectorImg(R.drawable.restaurandandbar);
        homeSelectorList.add(object2);

        ModelHomeSelector object3 = new ModelHomeSelector();
        object3.setSelectorTitle("Leisure Facility");
        object3.setSelectorImg(R.drawable.leisurefacility);
        homeSelectorList.add(object3);

        ModelHomeSelector object4 = new ModelHomeSelector();
        object4.setSelectorTitle("Go Green");
        object4.setSelectorImg(R.drawable.gogreeen);
        homeSelectorList.add(object4);

        ModelHomeSelector object5 = new ModelHomeSelector();
        object5.setSelectorTitle("Promotions");
        object5.setSelectorImg(R.drawable.promotions);
        homeSelectorList.add(object5);

        ModelHomeSelector object6 = new ModelHomeSelector();
        object6.setSelectorTitle("Tv Guide");
        object6.setSelectorImg(R.drawable.tvguide);
        homeSelectorList.add(object6);


        RecyclerView rvSelector = findViewById(R.id.rv_home_selector);
        rvSelector.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
        HomeSelectorAdapter adapter = new HomeSelectorAdapter(this, homeSelectorList);
        rvSelector.setAdapter(adapter);
       // rvSelector.getChildAt(2).requestFocus();
        adapter.notifyDataSetChanged();


        tvCurrentTime=findViewById(R.id.tvCurrentTime);
        tvCurrentDate=findViewById(R.id.tvCurrentDate);

        String date =DateFormat.getTimeInstance(DateFormat.SHORT).format(new Date());

        tvCurrentTime.setText(date);

        long dates = System.currentTimeMillis();

        SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd/ MM/ yyyy");
        String dateString = sdf.format(dates);
        tvCurrentDate.setText(dateString);



    }
}
  <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_home_selector"
            android:layout_width="match_parent"
            android:layout_marginStart="30dp"
            android:layout_centerVertical="true"
            android:layout_height="wrap_content"
            android:layoutAnimation="@anim/layout_animation"
            android:descendantFocusability="afterDescendants"
            android:focusedByDefault="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

适配器类

public class HomeSelectorAdapter extends RecyclerView.Adapter<HomeSelectorAdapter.ViewHolder> {



    private List<ModelHomeSelector> homeSelectorList = new ArrayList<>();
    int row_index=0;
    Context context;

    public HomeSelectorAdapter(Context context, List<ModelHomeSelector> homeSelectorList) {
        this.context = context;
        this.homeSelectorList = homeSelectorList;
    }

    @NonNull
    @Override
    public HomeSelectorAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.row_home, parent, false);

        itemView.setFocusable(true);
        itemView.setFocusableInTouchMode(true);

        return new ViewHolder(itemView);
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") final int position) {

       final String selectorTitle = homeSelectorList.get(position).getSelectorTitle();
       holder.selectorTitle.setText(selectorTitle);
       holder.selectorImg.setImageResource(Integer.parseInt(String.valueOf(homeSelectorList.get(position).getSelectorImg())));
       //holder.selectorCard.setBackgroundResource(R.drawable.circle);
        //holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(270,270));



        holder.selectorCard.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                Intent intent= new Intent(context, PrimaryBrowser.class);
                intent.putExtra("card_name",selectorTitle);
                //context.startActivity(intent);
                Toast.makeText(context, "selected by d-pad", Toast.LENGTH_SHORT).show();

                row_index=position;
                notifyDataSetChanged();

            }

        });
        if(row_index==position){
            holder.selectorCard.setBackgroundResource(R.drawable.circle);
            holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(250,250));
            holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
            //holder.selectorImg.setMinimumHeight(50);
            //holder.selectorImg.setMinimumWidth(50);
        }
        else
        {
            holder.selectorCard.setBackgroundResource(R.drawable.gray_circle);
            holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(200 ,200));
            holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,8);


        }


      /* holder.selectorCard.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                        Intent intent= new Intent(context, PrimaryBrowser.class);
                        intent.putExtra("card_name",selectorTitle);
                        context.startActivity(intent);

                        row_index=position;
                        notifyDataSetChanged();
                    }


                });

        //});
        if(row_index==position){
            holder.selectorCard.setBackgroundResource(R.drawable.circle);
            holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(250,250));
            holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
            //holder.selectorImg.setMinimumHeight(50);
            //holder.selectorImg.setMinimumWidth(50);
        }
        else
        {
            holder.selectorCard.setBackgroundResource(R.drawable.gray_circle);
            holder.selectorCard.setLayoutParams(new RelativeLayout.LayoutParams(200 ,200));
            holder.selectorTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP,8);


        }*/


    }


    @Override
    public int getItemCount() {
        return homeSelectorList.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView selectorTitle;
        public ImageView selectorImg;
        public RelativeLayout selectorCard;
        public ViewHolder(View itemView) {
            super(itemView);
            selectorCard = (RelativeLayout) itemView.findViewById(R.id.selector_card);
            selectorTitle = (TextView) itemView.findViewById(R.id.tv_home_seletor);
            selectorImg=(ImageView) itemView.findViewById(R.id.iv_home_selector);
        }
    }}

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.rimapps.myapplication">
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-feature
        android:name="android.software.leanback"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.Leanback"
        tools:ignore="GoogleAppIndexingWarning">
        <activity android:name=".activity.GuestDirectoryActivity"></activity>
        <activity
            android:name=".activity.PrimaryBrowser"
            android:label="@string/title_activity_primary_browser"
            android:screenOrientation="landscape" />
        <activity android:name=".PlaybackActivity" />
        <activity android:name=".BrowseErrorActivity" />
        <activity
            android:name=".activity.MainActivity"
            android:banner="@drawable/app_icon_your_company"
            android:icon="@drawable/app_icon_your_company"
            android:label="@string/app_name"
            android:logo="@drawable/app_icon_your_company"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DetailsActivity" />

    </application>

</manifest>

注意:我在仿真器中使用键盘而不是D-pad对其进行了测试

android android-studio android-recyclerview android-tv leanback
1个回答
0
投票

[如果您只是想在瘦身应用程序中显示内容行,则可能要检查RowsSupportFragment-RowsSupportFragment

您将可以使用BaseOnItemViewSelectedListener

也了解垂直行的BrowseSupportFragment,如官方文档中所述,它在其中包含RowsSupportFragment-BrowseSupportFragment

用于创建Leanback浏览屏幕的片段。它由RowsSupportFragment和HeadersSupportFragment组成。

BrowseSupportFragment将其ObjectAdapter的元素呈现为垂直列表中的一组行。该适配器中的元素必须是Row的子类。

片段的适配器获取Row对象的列表和用于处理行的Presenter,每行获取用于内部行项目处理的Adapter。

这里是官方文档示例-Create a catalog browser

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.