Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中用作嵌套视图或RecyclerView项视图的自定义视图_Java_Android - Fatal编程技术网

Java 在Android中用作嵌套视图或RecyclerView项视图的自定义视图

Java 在Android中用作嵌套视图或RecyclerView项视图的自定义视图,java,android,Java,Android,我是android新手,但有很好的JavaFX体验。我正在尝试创建一个可以重用的自定义视图,但很难找到正确的方法 在javafx中,我可以通过:创建一个单独的fxml文件来定义自定义视图的布局,然后创建一个链接到fxml文件的控制器类,在这个类中,我有一个方法来检索控制器的数据模型并用它来填充标签,等等 我想要的自定义视图是 受约束布局 TextView(约束到右锚定) 圆形文本视图(约束到左锚定) 在安卓系统中实现这一点的最佳方式是什么?另外,是否可以使用回收视图来实现这一点?如果是

我是android新手,但有很好的JavaFX体验。我正在尝试创建一个可以重用的自定义视图,但很难找到正确的方法

在javafx中,我可以通过:创建一个单独的fxml文件来定义自定义视图的布局,然后创建一个链接到fxml文件的控制器类,在这个类中,我有一个方法来检索控制器的数据模型并用它来填充标签,等等

我想要的自定义视图是

  • 受约束布局
    • TextView(约束到右锚定)
    • 圆形文本视图(约束到左锚定)

在安卓系统中实现这一点的最佳方式是什么?另外,是否可以使用回收视图来实现这一点?如果是,如何为每个项目使用自定义视图并设置其数据?

问题很广泛。您可能需要更多关于创建视图的研究

  • 在main.xml中创建一个recyclerview
  • 带有项目视图的单独文件。
    • 项目视图中有3个视图-带边距的白色背景(linearlayout?),右文本视图和左文本视图
    • 左边的文本视图应该在drawables文件夹中定义了android:background=“drawable/round\u shape”和round\u shape.xml。一切都在3个xml文件中完成,main.xml用于recyclerview、item.xml、round_background.xml。然后,使用recyclerview适配器将TextView与数组绑定,并进行recyclerview初始化
  • 典型的RV适配器

     public class MyRV extends RecyclerView.Adapter<MyRV.ViewHolder> {
    
    private List<MyModelItemWith2Strings> mDataSet; // You may need to setup an array, 
                       // with 2 String objects - for the right and left textviews
    
    
    // Use an array of class with 2 elements rather than <String>, e.g. List<MyModelItemWith2Strings>
    // pass your model here
     // this setData will be used to provide the contents for the textviews
    void setData(List< /* set your 2 string class here*/ > dataSet) {
        mDataSet = dataSet;
    }
    
    static class ViewHolder extends RecyclerView.ViewHolder {
    
       // Here you bind item TV's
       // first you declare textviews that you will use to fill with data
       // Add any other item views you will need to fill in
    
        public TextView tv;
        public TextView tv2;
    
        public ViewHolder(LinearLayout v) {
            super(v);
    
            // Bind itemview views here. Put R.id.tv from your itemview.xml
    
            tv = v.findViewById(R.id.....);
             tv2 = v...
        }
    }
    
    // Add your itemview layout here
    @Override
    public MyRV.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LinearLayout v = (LinearLayout) LayoutInflater.from(parent.getContext())
            .inflate(/***R.layout.item_view***/, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }
    
    
    @Override
    public void onBindViewHolder( MyRV.ViewHolder h, int position) {
    
        // get content from your model (the above list) and fill in the the itemview textviews
    
        String a= mDataSet.get(position).getItem1();
        String b = mDataSet.get(position). getItem2();
        ...
    
        h.tv.setText(a);
        // set clickers if you want to. The clicker class is below.
        h.tv.setOnClickListener(new Click(position));
    
        h.tv2.setText(...)
    }
    
    // This is obligatory to pass for your RV to initialize. It won't work if you don' t tell Android how to count your array soze
    @Override
    public int getItemCount() {
        return mDataSet.size();
    }
    
    // These are my implementation of clickers. I prefer to put them in the nested class of the adapter.
    private class Click  implements OnClickListener {
        private int pos;
        Click(int position) {
            pos = position;
        }
    
        @Override
        public void onClick(View p1) {
            // get data from your array on click
            mDataSet.get(pos);
            // Use pos as position on the array, mData.get(pos)
        }
        }
    }
    

    你的回收商视图中充满了数据

    问题很广泛。以recyclerview为例,做一些练习。在main.xml中创建一个recyclerview,并使用项目视图创建一个单独的文件。项目视图中有3个视图-带边距的白色背景(linearlayout?),右文本视图和左文本视图。左边的文本视图应该在drawables文件夹中定义了android:background=“drawable/round\u shape”和round\u shape.xml。一切都在3个xml文件中完成,main.xml用于recyclerview、item.xml、round_background.xml。然后,使用recyclerview适配器将TextView与数组绑定,并进行recyclerview初始化。@EugeneKartoyev谢谢,我现在就尝试一下。如果你能在回答中形成这个评论。另外,我将如何将项目模型传递给项目视图。适配器如何知道要使用模型中的哪个字段设置文本的textview。该模型将包含两个字符串,这两个字符串应绑定到右文本视图和左文本视图。啊,我想我应该为这个做一个定制的适配器类,正如我在这里看到的()
       RecyclerView rv = (RecyclerView) findViewById(R.id.rv_In_Main_Xml);
    
        // just additional tunings. 
        rv.setHasFixedSize(true);
        rv.setLayoutManager(new LinearLayoutManager(context)); // <- context = this, if you are in the Main activity
    
    MyRV rva = new MyRV();
    rva.setData(myArray_with_2_string_objects_to_fill_tvs);
    rv.setAdaptor(rva);