Итак, я создаю небольшое приложение, и благодаря этому сайту я продвинулся на нем намного больше. Идея заключается в том, что у меня будет только кнопка, и когда она будет нажата, она добавит новую строку с двумя «EditText» и одним «CheckBox». Я несколько выполнил это путем динамического добавления их с помощью специального ListView и пользовательского адаптера. Я все еще нахожусь в пользовательских списках ListView и адаптерах.Добавление просмотров в другую строку (другое LinearLayout)?
В любом случае, я получил его, чтобы добавить два 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 с пользовательским адаптером для этого. Это самый простой способ сделать это. –