【问题标题】:Unable to Draw lines between two listviews or list of buttons in horizontal无法在两个列表视图或水平按钮列表之间画线
【发布时间】:2020-01-23 06:21:23
【问题描述】:

我正在尝试在两列之间画线,每列包含 10 个按钮,如下图所示。我尝试使用线性布局。

private void createCHTDesign(int scenarios, int numberOfPlots, ArrayList<Plots> plotsArrayList) {

        headingLayout.clear();
        Log.d(TAG, "scenarios:" + scenarios);
        Log.d(TAG, "headingsize:" + headingLayout.size());

        for (int i = 0; i < scenarios; i++) {

            LinearLayout linearLayout = new LinearLayout(mContext);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            if (i == 0) {
                params.setMargins(0, 0, 0, 0);

            } else {
                params.setMargins(250, 0, 0, 0);
            }

            linearLayout.setOrientation(LinearLayout.VERTICAL);
            linearLayout.setLayoutParams(params);
            mainLayout.addView(linearLayout);
            headingLayout.add(linearLayout);
            Log.d(TAG, "count:" + mainLayout.getChildCount());
        }

        for (int i = 0; i < headingLayout.size(); i++) {
            addButtons(headingLayout.get(i), i, numberOfPlots, plotsArrayList);
        }
    }

    @SuppressLint("ClickableViewAccessibility")
    private void addButtons(LinearLayout layout, int index, int numberOfPlots, ArrayList<Plots> plotsArrayList) {

        TextView textView = new TextView(mContext);
        LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        textView.setLayoutParams(tvParams);
        textView.setText(combinationNames.get(index));
        textView.setTextSize(16);
        layout.addView(textView);


        for (int i = 0; i < numberOfPlots; i++) {

            Button button = new Button(mContext);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(400, 150);
            button.setLayoutParams(params);
            button.setId(View.generateViewId());

            button.setText(plotsArrayList.get(i).getMpValue() + "\n" + plotsArrayList.get(i).getYield());
            button.setGravity(Gravity.CENTER_VERTICAL);
            button.setPadding(15, 0, 0, 0);
            button.setTextColor(Color.parseColor("#FFFFFF"));
            button.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.right2x, 0);
            GradientDrawable gradientDrawable = new GradientDrawable();
            gradientDrawable.setColor(Color.parseColor(colors[i]));
            gradientDrawable.setCornerRadius(10);
            gradientDrawable.setStroke(20, Color.parseColor(colors[i]));

            clickonArrow(button.getText().toString(), button);

            button.setBackground(gradientDrawable);
            layout.addView(button);
        }

    }

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:orientation="vertical"
    android:fitsSystemWindows="true">



    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="1"
        android:layout_margin="10dp">

        <androidx.appcompat.widget.AppCompatSpinner
            android:id="@+id/spinner"
            android:layout_width="wrap_content"
            android:layout_weight="0.3"
            android:layout_height="wrap_content"
            android:spinnerMode="dropdown"
            android:gravity="center"
            style="@style/SpinnerTheme"
            />
        <androidx.appcompat.widget.AppCompatSpinner
            android:id="@+id/spinner2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.3"
            android:spinnerMode="dropdown"
            android:gravity="center"
            style="@style/SpinnerTheme"/>


        <androidx.appcompat.widget.AppCompatSpinner
            android:id="@+id/spinner3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.3"
            android:gravity="center"
            android:spinnerMode="dropdown"
            style="@style/SpinnerTheme" />

    </LinearLayout>


    <EditText
        android:id="@+id/searchCht"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableLeft="@drawable/ic_search"
        android:layout_marginLeft="10dp"
        android:hint="Search CHT"
        android:backgroundTint="@android:color/black"
        android:layout_marginRight="10dp"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:fillViewport="true"
        android:scrollbars="horizontal">

        <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:id="@+id/mainLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

              <!--  <com.sma.cht.chtcharacterization.view.MatchTheFollowingAttempted
                    android:id="@+id/match"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:scrollbarThumbHorizontal="@color/colorPrimary"
                    android:scrollbars="horizontal">

                </com.sma.cht.chtcharacterization.view.MatchTheFollowingAttempted>
          -->
            </LinearLayout>

        </HorizontalScrollView>
    </ScrollView>


</LinearLayout>

目前,我在两列中都获得了按钮,但无法画线,您也可以使用 listview 来完成这些按钮的工作。你能帮我解决这个问题吗?提前致谢。

【问题讨论】:

    标签: android canvas bitmap android-linearlayout


    【解决方案1】:

    将你的交叉线分成两部分。

    试试下面的代码,

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerview=findViewById(R.id.recyclerview);
        recyclerview.setLayoutManager(new LinearLayoutManager(this));
        recyclerview.setAdapter(new SampleAdapter());
    }
    

    }

    SampleAdapter.java

    public class SampleAdapter extends RecyclerView.Adapter<SampleAdapter.MyViewHolder> {
    ArrayList<String> list1;
    ArrayList<String> list2;
    
    public SampleAdapter() {
        list1 = new ArrayList<>();
        list2 = new ArrayList<>();
        for (int i = 1; i <= 20; i++) {
            list1.add("Left " + i);
            list2.add("Right " + i);
        }
    }
    @NonNull
    @Override
    public SampleAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycle_item, viewGroup, false);
        return new SampleAdapter.MyViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(@NonNull SampleAdapter.MyViewHolder myViewHolder, int position) {
        myViewHolder.buttonLeft.setText(list1.get(position));
        myViewHolder.buttonRight.setText(list2.get(position));
    
        //show partA image
        if (position == 8) {
            myViewHolder.imageview1.setVisibility(View.GONE);
            myViewHolder.imageview2.setVisibility(View.VISIBLE);
        }
        //show partB image
        if (position == 9) {
            myViewHolder.imageview1.setVisibility(View.GONE);
            myViewHolder.imageview3.setVisibility(View.VISIBLE);
        }
    }
    
    @Override
    public int getItemCount() {
        return list1.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder {
        Button buttonLeft, buttonRight;
        ImageView imageview1, imageview2, imageview3;
    
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            buttonLeft = itemView.findViewById(R.id.buttonLeft);
            buttonRight = itemView.findViewById(R.id.buttonRight);
            imageview1 = itemView.findViewById(R.id.imageview1);
            imageview2 = itemView.findViewById(R.id.imageview2);
            imageview3 = itemView.findViewById(R.id.imageview3);
        }
    }}
    

    recycle_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="5">
        <Button
            android:id="@+id/buttonLeft"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="text" />
        <ImageView
            android:id="@+id/imageview1"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:background="#B3D4F3"
            android:visibility="visible" />
    
        <ImageView
            android:id="@+id/imageview2"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="@drawable/image_a"          android:visibility="gone" />
    
        <ImageView
            android:id="@+id/imageview3"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="@drawable/image_b  android:visibility="gone" />
    
       <Button
            android:id="@+id/buttonRight"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="text" />
    </LinearLayout>
    

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    

    image_a.png

    image_b.png

    输出

    【讨论】:

    • 它不像只有两个列表视图,我们将有 12 个列表视图,并且应该根据按钮颜色绘制线条,如果左侧按钮为蓝色并且右侧按钮为蓝色,我们需要绘制线条
    • 为什么-1。根据你的问题,我已经发布了答案。你发布的结果输出的图像看起来相同
    猜你喜欢
    • 2019-04-01
    • 2013-10-07
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多