2016-05-23 3 views
2

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

В любом случае, я получил его, чтобы добавить два EditText и один CheckBox при нажатии кнопки, но после этого он не добавит больше (это отдельная проблема). Проблема, с которой я столкнулась, заключается в том, что она добавит их в ту же строку, что и кнопка. Здесь я теряюсь. Я не уверен, как заставить этот пользовательский ListView отображать новую строку, а не ту же строку, что и кнопка.

enter image description here

Теперь, вот мой 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> 

Спасибо заранее всем! Я застрял здесь несколько дней. Не ищу, чтобы кто-нибудь написал приложение для меня, просто искал какое-то направление.

+0

Я тоже сделал это с моими приложениями, но я не добавил динамическое представление. Я просто использовал их в своем XML-макете и в OnCreate() он установил видимость для View.GONE и кнопки Button onClick для View.VISIBLE. –

+0

Вам нужно использовать Listview или RecyclerView с пользовательским адаптером для этого. Это самый простой способ сделать это. –

ответ

0

убедитесь, что после добавления кнопки вы назвали эти два метода в адаптере, чтобы обновить список

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

Если ваш код работает правильно и добавить строку на той же строке, то пожалуйста, проверьте ниже решения.

Как есть запись ниже строки,

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

в OnButton CLICK событие, поэтому каждый раз, когда кнопка будет нажата, она инициализируется строки снова и удалить все предыдущие записи из него, так что просто написать выше линии в верхней или в методе onCreate() после setContentView, тогда вы получите все строки при нажатии.

Надеюсь, это поможет вам.

Смежные вопросы