【问题标题】:Adding views to another line (another LinearLayout)?将视图添加到另一行(另一个 LinearLayout)?
【发布时间】:2016-09-19 20:48:00
【问题描述】:

所以我正在创建一个小型应用程序,感谢这个网站,我在它上面取得了更大的进步。它的想法是我只有一个按钮,当它被点击时,它将添加一个带有两个“EditText”和一个“CheckBox”的新行。通过使用自定义 ListView 和自定义适配器动态添加这些,我在某种程度上实现了这一点。我仍然不确定自定义 ListView 和适配器。

无论如何,我已经让它在单击按钮时添加两个 EditText 和一个 CheckBox,但在此之后它不会再添加(尽管这是一个单独的问题)。我遇到的问题是它会将它们添加到按钮所在的同一行。这就是我迷路的地方。我不确定如何让这个自定义 ListView 显示在新行上,而不是与按钮显示在同一行上。

现在,这是我的 MainActivity 代码:

import android.content.Context;
import android.graphics.Color;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.view.ViewGroup.LayoutParams;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    ArrayList<CheckBox> checkBoxes = new ArrayList<>();
    ArrayList<EditText> courses = new ArrayList<>();
    ArrayList<EditText> credits = new ArrayList<>();

    int numOfCheckBoxes = 0;

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

        final LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
        ll.setOrientation(LinearLayout.HORIZONTAL);

        Button addCourse = new Button(this);
        addCourse.setLayoutParams(new ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        addCourse.setText("Add Course");
        addCourse.setTextColor(Color.parseColor("#FFFFFF"));
        addCourse.setBackgroundColor(Color.parseColor("#FF0000"));
        addCourse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ListView myListView = new ListView(MainActivity.this);
                List<CustomRow> rows = new ArrayList<CustomRow>();
                rows.add(new CustomRow(MainActivity.this));
                MyListArrayAdapter myAdapter = new MyListArrayAdapter(MainActivity.this, rows);
                myListView.setAdapter(myAdapter);
                ll.addView(myListView);
            }
        });
        ll.addView(addCourse);
    } // End of onCreate

    public void onCheckBoxChecked(View v) {
        for (int i = 0; i < numOfCheckBoxes; i++) {
            if (checkBoxes.get(i).isChecked()) {
                courses.get(i).setEnabled(false);
                courses.get(i).setFocusable(false);
                courses.get(i).setInputType(InputType.TYPE_NULL);
                credits.get(i).setEnabled(false);
                credits.get(i).setFocusable(false);
                credits.get(i).setInputType(InputType.TYPE_NULL);
            } else {
                courses.get(i).setEnabled(true);
                courses.get(i).setFocusable(true);
                courses.get(i).setFocusableInTouchMode(true);
                courses.get(i).setInputType(InputType.TYPE_CLASS_TEXT);
                credits.get(i).setEnabled(true);
                credits.get(i).setFocusableInTouchMode(true);
                credits.get(i).setFocusable(true);
                credits.get(i).setInputType(InputType.TYPE_CLASS_NUMBER);
            } // End of if else
        } // End of for loop
    } // End of onCheckBoxChecked
} // End of MainActivity

这是我的“MyListArrayAdapter”类(我的自定义适配器):

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.view.LayoutInflater;
import android.widget.CheckBox;
import android.widget.EditText;

import java.util.List;

 /**
 * Created by Thomas on 5/21/2016.
 */
public class MyListArrayAdapter extends BaseAdapter {

    LayoutInflater inflater;
    List<CustomRow> rows;

    public MyListArrayAdapter(Activity context, List rows){
        super();

        this.rows = rows;
        this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() {
        return rows.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        CustomRow row = rows.get(position);

        View v = convertView;

        if (convertView==null) {
            v = inflater.inflate(R.layout.new_course_row, null);
        }

        EditText course = (EditText) v.findViewById(R.id.course);
        EditText credits = (EditText) v.findViewById(R.id.credits);
        CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkBox);

        course.setHint("Enter Course");
        credits.setHint("Enter Credits");
        checkBox.setText("Check if complete");
        course.setMaxHeight(150);
        credits.setMaxHeight(150);
        checkBox.setMaxHeight(150);

        return v;
    }
}

我的“CustomRow”类(有两个EditText和一个CheckBox的自定义类):

import android.content.Context;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;

 /**
 * Created by Thomas on 5/21/2016.
 */
public class CustomRow extends LinearLayout{


        public CustomRow(Context context) {
        super(context);

        setOrientation(LinearLayout.HORIZONTAL);

        EditText course = new EditText(context);
        EditText credits = new EditText(context);
        CheckBox checkBox = new CheckBox(context);

        addView(course);
        addView(credits);
        addView(checkBox);
    }
}

我的“new_course_row.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">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/course"
        android:layout_weight="1"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/credits"
        android:layout_weight="1"/>

    <CheckBox
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/checkBox"
        android:onClick="onCheckBoxChecked"/>

</LinearLayout>

最后,我的“activity_main.xml”:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="exporian.collegetracker.MainActivity"
        android:id="@+id/ll">

    </LinearLayout>
</ScrollView>

提前谢谢大家!我被困在这里好几天了。不找人帮我写应用,只是找方向。

【问题讨论】:

  • 我的应用程序也这样做了,但我没有动态添加视图。我只是将它们放在我的 XML 布局中,并在 OnCreate() 上将可见性设置为 View.GONE 并将 Button onClick 设置为 View.VISIBLE。
  • 您需要使用带有自定义适配器的 Listview 或 RecyclerView 。这是最简单的方法。

标签: java android android-linearlayout android-custom-view


【解决方案1】:

确保添加按钮后,您已在适配器中调用这两个方法来更新列表

 BuddyFeedsAdapter.this.notifyDataSetChanged();
            notifyDataSetInvalidated();

【讨论】:

    【解决方案2】:

    如果您的代码工作正常并在同一行添加行,请查看以下解决方案。

    正如你在下面写的那样,

    List<CustomRow> rows = new ArrayList<CustomRow>();
    

    在 OnButton CLick 事件中,因此每当单击按钮时,它都会再次初始化行并从中删除所有以前的记录,因此只需在顶部或 setContentView 之后的 onCreate() 方法中写上一行,然后您将获得所有行点击。

    希望这会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多